/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
1
# Copyright (C) 2008, 2009, 2010 Canonical Ltd
3221.11.3 by Robert Collins
Add missing test script.
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
3221.11.3 by Robert Collins
Add missing test script.
16
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
17
"""Tests for Branch.get_stacked_on_url and set_stacked_on_url."""
3221.11.3 by Robert Collins
Add missing test script.
18
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
19
from bzrlib import (
3770.2.1 by Michael Hudson
test and feature
20
    branch,
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
21
    bzrdir,
4332.3.35 by Robert Collins
Fix failing tests.
22
    check,
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
23
    errors,
24
    )
25
from bzrlib.revision import NULL_REVISION
5325.1.6 by Andrew Bennetts
Fix test_clone_from_branch_stacked_on_relative_url_preserve_stacking failure by making it use get_url so that it tests RemoteBranch* cases the same as others. Also remove some unused imports.
26
from bzrlib.tests import TestNotApplicable, transport_util
4523.1.1 by Martin Pool
Rename tests.branch_implementations to per_branch
27
from bzrlib.tests.per_branch import TestCaseWithBranch
3221.11.3 by Robert Collins
Add missing test script.
28
29
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
30
unstackable_format_errors = (
3928.3.1 by John Arbash Meinel
Fix Branch.open() so that for stacked branches we don't open multiple connections.
31
    errors.UnstackableBranchFormat,
32
    errors.UnstackableRepositoryFormat,
33
    )
34
35
3221.11.3 by Robert Collins
Add missing test script.
36
class TestStacking(TestCaseWithBranch):
37
3830.3.16 by Martin Pool
Add passing tests for iter_lines_added_or_present in stacked repos
38
    def check_lines_added_or_present(self, stacked_branch, revid):
39
        # similar to a failure seen in bug 288751 by mbp 20081120
40
        stacked_repo = stacked_branch.repository
41
        stacked_repo.lock_read()
42
        try:
43
            list(stacked_repo.inventories.iter_lines_added_or_present_in_keys(
44
                    [(revid,)]))
45
        finally:
46
            stacked_repo.unlock()
47
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
48
    def test_get_set_stacked_on_url(self):
3221.11.3 by Robert Collins
Add missing test script.
49
        # branches must either:
50
        # raise UnstackableBranchFormat or
51
        # raise UnstackableRepositoryFormat or
52
        # permit stacking to be done and then return the stacked location.
53
        branch = self.make_branch('branch')
54
        target = self.make_branch('target')
55
        try:
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
56
            branch.set_stacked_on_url(target.base)
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
57
        except unstackable_format_errors:
3221.11.3 by Robert Collins
Add missing test script.
58
            # if the set failed, so must the get
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
59
            self.assertRaises(unstackable_format_errors, branch.get_stacked_on_url)
4103.2.3 by Andrew Bennetts
Other tests for good luck.
60
            self.assertFalse(branch._format.supports_stacking())
3221.11.3 by Robert Collins
Add missing test script.
61
            return
4103.2.3 by Andrew Bennetts
Other tests for good luck.
62
        self.assertTrue(branch._format.supports_stacking())
3221.11.3 by Robert Collins
Add missing test script.
63
        # now we have a stacked branch:
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
64
        self.assertEqual(target.base, branch.get_stacked_on_url())
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
65
        branch.set_stacked_on_url(None)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
66
        self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
3221.13.2 by Robert Collins
Add a shallow parameter to bzrdir.sprout, which involved fixing a lateny bug in pack to pack fetching with ghost discovery.
67
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
68
    def test_get_set_stacked_on_relative(self):
69
        # Branches can be stacked on other branches using relative paths.
70
        branch = self.make_branch('branch')
71
        target = self.make_branch('target')
72
        try:
3537.3.5 by Martin Pool
merge trunk including stacking policy
73
            branch.set_stacked_on_url('../target')
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
74
        except unstackable_format_errors:
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
75
            # if the set failed, so must the get
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
76
            self.assertRaises(unstackable_format_errors, branch.get_stacked_on_url)
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
77
            return
3537.3.5 by Martin Pool
merge trunk including stacking policy
78
        self.assertEqual('../target', branch.get_stacked_on_url())
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
79
4462.3.2 by Robert Collins
Do not stack on the same branch/repository anymore. This was never supported and would generally result in infinite recursion. Fixes bug 376243.
80
    def test_set_stacked_on_same_branch_raises(self):
81
        # Stacking on the same branch silently raises and doesn't execute the
82
        # change. Reported in bug 376243.
83
        branch = self.make_branch('branch')
84
        try:
85
            self.assertRaises(errors.UnstackableLocationError,
86
                branch.set_stacked_on_url, '../branch')
87
        except unstackable_format_errors:
88
            # if the set failed, so must the get
89
            self.assertRaises(unstackable_format_errors, branch.get_stacked_on_url)
90
            return
91
        self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
92
93
    def test_set_stacked_on_same_branch_after_being_stacked_raises(self):
94
        # Stacking on the same branch silently raises and doesn't execute the
95
        # change.
96
        branch = self.make_branch('branch')
97
        target = self.make_branch('target')
98
        try:
99
            branch.set_stacked_on_url('../target')
100
        except unstackable_format_errors:
101
            # if the set failed, so must the get
102
            self.assertRaises(unstackable_format_errors, branch.get_stacked_on_url)
103
            return
104
        self.assertRaises(errors.UnstackableLocationError,
105
            branch.set_stacked_on_url, '../branch')
106
        self.assertEqual('../target', branch.get_stacked_on_url())
107
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
108
    def assertRevisionInRepository(self, repo_path, revid):
109
        """Check that a revision is in a repository, disregarding stacking."""
110
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
111
        self.assertTrue(repo.has_revision(revid))
112
113
    def assertRevisionNotInRepository(self, repo_path, revid):
114
        """Check that a revision is not in a repository, disregarding stacking."""
115
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
116
        self.assertFalse(repo.has_revision(revid))
117
118
    def test_get_graph_stacked(self):
119
        """A stacked repository shows the graph of its parent."""
120
        trunk_tree = self.make_branch_and_tree('mainline')
121
        trunk_revid = trunk_tree.commit('mainline')
122
        # make a new branch, and stack on the existing one.  we don't use
123
        # sprout(stacked=True) here because if that is buggy and copies data
124
        # it would cause a false pass of this test.
125
        new_branch = self.make_branch('new_branch')
126
        try:
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
127
            new_branch.set_stacked_on_url(trunk_tree.branch.base)
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
128
        except unstackable_format_errors, e:
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
129
            raise TestNotApplicable(e)
130
        # reading the graph from the stacked branch's repository should see
131
        # data from the stacked-on branch
132
        new_repo = new_branch.repository
133
        new_repo.lock_read()
134
        try:
135
            self.assertEqual(new_repo.get_parent_map([trunk_revid]),
136
                {trunk_revid: (NULL_REVISION, )})
137
        finally:
138
            new_repo.unlock()
139
140
    def test_sprout_stacked(self):
3221.13.2 by Robert Collins
Add a shallow parameter to bzrdir.sprout, which involved fixing a lateny bug in pack to pack fetching with ghost discovery.
141
        # We have a mainline
142
        trunk_tree = self.make_branch_and_tree('mainline')
143
        trunk_revid = trunk_tree.commit('mainline')
3221.18.4 by Ian Clatworthy
shallow -> stacked
144
        # and make branch from it which is stacked
3221.13.2 by Robert Collins
Add a shallow parameter to bzrdir.sprout, which involved fixing a lateny bug in pack to pack fetching with ghost discovery.
145
        try:
3221.18.4 by Ian Clatworthy
shallow -> stacked
146
            new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
147
        except unstackable_format_errors, e:
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
148
            raise TestNotApplicable(e)
149
        # stacked repository
150
        self.assertRevisionNotInRepository('newbranch', trunk_revid)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
151
        tree = new_dir.open_branch().create_checkout('local')
152
        new_branch_revid = tree.commit('something local')
3537.3.4 by Martin Pool
Improved branch stacking tests
153
        self.assertRevisionNotInRepository('mainline', new_branch_revid)
154
        self.assertRevisionInRepository('newbranch', new_branch_revid)
155
3793.1.2 by Andrew Bennetts
Add test showing that stacking from the smart server works.
156
    def test_sprout_stacked_from_smart_server(self):
157
        # We have a mainline
158
        trunk_tree = self.make_branch_and_tree('mainline')
159
        trunk_revid = trunk_tree.commit('mainline')
160
        # Make sure that we can make a stacked branch from it
161
        try:
162
            trunk_tree.bzrdir.sprout('testbranch', stacked=True)
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
163
        except unstackable_format_errors, e:
3793.1.2 by Andrew Bennetts
Add test showing that stacking from the smart server works.
164
            raise TestNotApplicable(e)
165
        # Now serve the original mainline from a smart server
166
        remote_transport = self.make_smart_server('mainline')
167
        remote_bzrdir = bzrdir.BzrDir.open_from_transport(remote_transport)
168
        # and make branch from the smart server which is stacked
169
        new_dir = remote_bzrdir.sprout('newbranch', stacked=True)
170
        # stacked repository
171
        self.assertRevisionNotInRepository('newbranch', trunk_revid)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
172
        tree = new_dir.open_branch().create_checkout('local')
173
        new_branch_revid = tree.commit('something local')
3793.1.2 by Andrew Bennetts
Add test showing that stacking from the smart server works.
174
        self.assertRevisionNotInRepository('mainline', new_branch_revid)
175
        self.assertRevisionInRepository('newbranch', new_branch_revid)
176
3537.3.4 by Martin Pool
Improved branch stacking tests
177
    def test_unstack_fetches(self):
178
        """Removing the stacked-on branch pulls across all data"""
179
        # We have a mainline
180
        trunk_tree = self.make_branch_and_tree('mainline')
181
        trunk_revid = trunk_tree.commit('revision on mainline')
182
        # and make branch from it which is stacked
183
        try:
4509.3.17 by Martin Pool
test_unstack_fetches must put the stacked branch on the right transport to test remote formats
184
            new_dir = trunk_tree.bzrdir.sprout(self.get_url('newbranch'),
185
                stacked=True)
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
186
        except unstackable_format_errors, e:
3537.3.4 by Martin Pool
Improved branch stacking tests
187
            raise TestNotApplicable(e)
188
        # stacked repository
189
        self.assertRevisionNotInRepository('newbranch', trunk_revid)
4509.3.17 by Martin Pool
test_unstack_fetches must put the stacked branch on the right transport to test remote formats
190
        # TODO: we'd like to commit in the stacked repository; that requires
191
        # some care (maybe a BranchBuilder) if it's remote and has no
192
        # workingtree
193
        ##newbranch_revid = new_dir.open_workingtree().commit('revision in '
194
            ##'newbranch')
3537.3.4 by Martin Pool
Improved branch stacking tests
195
        # now when we unstack that should implicitly fetch, to make sure that
196
        # the branch will still work
197
        new_branch = new_dir.open_branch()
198
        new_branch.set_stacked_on_url(None)
199
        self.assertRevisionInRepository('newbranch', trunk_revid)
200
        # of course it's still in the mainline
201
        self.assertRevisionInRepository('mainline', trunk_revid)
202
        # and now we're no longer stacked
3537.3.5 by Martin Pool
merge trunk including stacking policy
203
        self.assertRaises(errors.NotStacked,
204
            new_branch.get_stacked_on_url)
3221.13.2 by Robert Collins
Add a shallow parameter to bzrdir.sprout, which involved fixing a lateny bug in pack to pack fetching with ghost discovery.
205
5325.1.4 by Andrew Bennetts
Improve comments.
206
    def test_unstack_already_locked(self):
5325.1.1 by Andrew Bennetts
Add failing test.
207
        """Removing the stacked-on branch with an already write-locked branch
208
        works.
209
210
        This was bug 551525.
211
        """
212
        try:
213
            stacked_bzrdir = self.make_stacked_bzrdir()
214
        except unstackable_format_errors, e:
215
            raise TestNotApplicable(e)
216
        stacked_branch = stacked_bzrdir.open_branch()
217
        stacked_branch.lock_write()
218
        stacked_branch.set_stacked_on_url(None)
219
        stacked_branch.unlock()
220
5325.1.4 by Andrew Bennetts
Improve comments.
221
    def test_unstack_already_multiple_locked(self):
222
        """Unstacking a branch preserves the lock count (even though it
223
        replaces the br.repository object).
224
225
        This is a more extreme variation of test_unstack_already_locked.
226
        """
5325.1.2 by Andrew Bennetts
Add another failing test.
227
        try:
228
            stacked_bzrdir = self.make_stacked_bzrdir()
229
        except unstackable_format_errors, e:
230
            raise TestNotApplicable(e)
231
        stacked_branch = stacked_bzrdir.open_branch()
232
        stacked_branch.lock_write()
233
        stacked_branch.lock_write()
234
        stacked_branch.lock_write()
235
        stacked_branch.set_stacked_on_url(None)
236
        stacked_branch.unlock()
237
        stacked_branch.unlock()
238
        stacked_branch.unlock()
239
3567.3.4 by Michael Hudson
make test a lot better
240
    def make_stacked_bzrdir(self, in_directory=None):
3567.3.7 by Michael Hudson
better docstring
241
        """Create a stacked branch and return its bzrdir.
3567.3.4 by Michael Hudson
make test a lot better
242
243
        :param in_directory: If not None, create a directory of this
244
            name and create the stacking and stacked-on bzrdirs in
245
            this directory.
246
        """
247
        if in_directory is not None:
248
            self.get_transport().mkdir(in_directory)
249
            prefix = in_directory + '/'
250
        else:
251
            prefix = ''
252
        tree = self.make_branch_and_tree(prefix + 'stacked-on')
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
253
        tree.commit('Added foo')
254
        stacked_bzrdir = tree.branch.bzrdir.sprout(
5325.1.1 by Andrew Bennetts
Add failing test.
255
            self.get_url(prefix + 'stacked'), tree.branch.last_revision(),
256
            stacked=True)
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
257
        return stacked_bzrdir
258
259
    def test_clone_from_stacked_branch_preserve_stacking(self):
3242.3.24 by Aaron Bentley
Fix test failures
260
        # We can clone from the bzrdir of a stacked branch. If
261
        # preserve_stacking is True, the cloned branch is stacked on the
262
        # same branch as the original.
3242.3.21 by Jonathan Lange
Preserve stacking in clone
263
        try:
3567.3.4 by Michael Hudson
make test a lot better
264
            stacked_bzrdir = self.make_stacked_bzrdir()
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
265
        except unstackable_format_errors, e:
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
266
            raise TestNotApplicable(e)
3242.3.24 by Aaron Bentley
Fix test failures
267
        cloned_bzrdir = stacked_bzrdir.clone('cloned', preserve_stacking=True)
3242.3.21 by Jonathan Lange
Preserve stacking in clone
268
        try:
269
            self.assertEqual(
3537.3.5 by Martin Pool
merge trunk including stacking policy
270
                stacked_bzrdir.open_branch().get_stacked_on_url(),
271
                cloned_bzrdir.open_branch().get_stacked_on_url())
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
272
        except unstackable_format_errors, e:
3242.3.21 by Jonathan Lange
Preserve stacking in clone
273
            pass
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
274
3567.3.4 by Michael Hudson
make test a lot better
275
    def test_clone_from_branch_stacked_on_relative_url_preserve_stacking(self):
276
        # If a branch's stacked-on url is relative, we can still clone
277
        # from it with preserve_stacking True and get a branch stacked
278
        # on an appropriately adjusted relative url.
3567.3.3 by Michael Hudson
very hackish test
279
        try:
3567.3.4 by Michael Hudson
make test a lot better
280
            stacked_bzrdir = self.make_stacked_bzrdir(in_directory='dir')
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
281
        except unstackable_format_errors, e:
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
282
            raise TestNotApplicable(e)
3567.3.4 by Michael Hudson
make test a lot better
283
        stacked_bzrdir.open_branch().set_stacked_on_url('../stacked-on')
5325.1.6 by Andrew Bennetts
Fix test_clone_from_branch_stacked_on_relative_url_preserve_stacking failure by making it use get_url so that it tests RemoteBranch* cases the same as others. Also remove some unused imports.
284
        cloned_bzrdir = stacked_bzrdir.clone(
285
            self.get_url('cloned'), preserve_stacking=True)
3567.3.4 by Michael Hudson
make test a lot better
286
        self.assertEqual(
287
            '../dir/stacked-on',
288
            cloned_bzrdir.open_branch().get_stacked_on_url())
3567.3.3 by Michael Hudson
very hackish test
289
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
290
    def test_clone_from_stacked_branch_no_preserve_stacking(self):
291
        try:
3567.3.4 by Michael Hudson
make test a lot better
292
            stacked_bzrdir = self.make_stacked_bzrdir()
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
293
        except unstackable_format_errors, e:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
294
            # not a testable combination.
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
295
            raise TestNotApplicable(e)
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
296
        cloned_unstacked_bzrdir = stacked_bzrdir.clone('cloned-unstacked',
297
            preserve_stacking=False)
3242.3.24 by Aaron Bentley
Fix test failures
298
        unstacked_branch = cloned_unstacked_bzrdir.open_branch()
3242.3.37 by Aaron Bentley
Updates from reviews
299
        self.assertRaises((errors.NotStacked, errors.UnstackableBranchFormat),
3537.3.5 by Martin Pool
merge trunk including stacking policy
300
                          unstacked_branch.get_stacked_on_url)
3242.3.37 by Aaron Bentley
Updates from reviews
301
302
    def test_no_op_preserve_stacking(self):
303
        """With no stacking, preserve_stacking should be a no-op."""
304
        branch = self.make_branch('source')
305
        cloned_bzrdir = branch.bzrdir.clone('cloned', preserve_stacking=True)
306
        self.assertRaises((errors.NotStacked, errors.UnstackableBranchFormat),
3537.3.5 by Martin Pool
merge trunk including stacking policy
307
                          cloned_bzrdir.open_branch().get_stacked_on_url)
3242.3.37 by Aaron Bentley
Updates from reviews
308
4617.3.1 by Robert Collins
Fix test_stacking tests for 2a as a default format. The change to 2a exposed some actual bugs, both in tests and bzrdir/branch code.
309
    def make_stacked_on_matching(self, source):
310
        if source.repository.supports_rich_root():
311
            if source.repository._format.supports_chks:
312
                format = "2a"
313
            else:
314
                format = "1.9-rich-root"
315
        else:
316
            format = "1.9"
317
        return self.make_branch('stack-on', format)
318
3242.3.37 by Aaron Bentley
Updates from reviews
319
    def test_sprout_stacking_policy_handling(self):
320
        """Obey policy where possible, ignore otherwise."""
4617.3.1 by Robert Collins
Fix test_stacking tests for 2a as a default format. The change to 2a exposed some actual bugs, both in tests and bzrdir/branch code.
321
        if isinstance(self.branch_format, branch.BzrBranchFormat4):
322
            raise TestNotApplicable('Branch format 4 does not autoupgrade.')
323
        source = self.make_branch('source')
324
        stack_on = self.make_stacked_on_matching(source)
3242.3.37 by Aaron Bentley
Updates from reviews
325
        parent_bzrdir = self.make_bzrdir('.', format='default')
326
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
327
        target = source.bzrdir.sprout('target').open_branch()
4617.3.1 by Robert Collins
Fix test_stacking tests for 2a as a default format. The change to 2a exposed some actual bugs, both in tests and bzrdir/branch code.
328
        # When we sprout we upgrade the branch when there is a default stack_on
329
        # set by a config *and* the targeted branch supports stacking.
330
        if stack_on._format.supports_stacking():
3641.1.1 by John Arbash Meinel
Merge in 1.6rc5 and revert disabling default stack on policy
331
            self.assertEqual('../stack-on', target.get_stacked_on_url())
4103.2.1 by Andrew Bennetts
Make clone/sprout stacking policy tests a little more precise.
332
        else:
333
            self.assertRaises(
334
                errors.UnstackableBranchFormat, target.get_stacked_on_url)
3242.3.38 by Aaron Bentley
Enhance tests
335
336
    def test_clone_stacking_policy_handling(self):
337
        """Obey policy where possible, ignore otherwise."""
4617.3.1 by Robert Collins
Fix test_stacking tests for 2a as a default format. The change to 2a exposed some actual bugs, both in tests and bzrdir/branch code.
338
        if isinstance(self.branch_format, branch.BzrBranchFormat4):
339
            raise TestNotApplicable('Branch format 4 does not autoupgrade.')
340
        source = self.make_branch('source')
341
        stack_on = self.make_stacked_on_matching(source)
3242.3.38 by Aaron Bentley
Enhance tests
342
        parent_bzrdir = self.make_bzrdir('.', format='default')
343
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
344
        target = source.bzrdir.clone('target').open_branch()
4617.3.1 by Robert Collins
Fix test_stacking tests for 2a as a default format. The change to 2a exposed some actual bugs, both in tests and bzrdir/branch code.
345
        # When we clone we upgrade the branch when there is a default stack_on
346
        # set by a config *and* the targeted branch supports stacking.
347
        if stack_on._format.supports_stacking():
3641.1.1 by John Arbash Meinel
Merge in 1.6rc5 and revert disabling default stack on policy
348
            self.assertEqual('../stack-on', target.get_stacked_on_url())
4103.2.1 by Andrew Bennetts
Make clone/sprout stacking policy tests a little more precise.
349
        else:
350
            self.assertRaises(
351
                errors.UnstackableBranchFormat, target.get_stacked_on_url)
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
352
4103.2.3 by Andrew Bennetts
Other tests for good luck.
353
    def test_sprout_to_smart_server_stacking_policy_handling(self):
354
        """Obey policy where possible, ignore otherwise."""
355
        if isinstance(self.branch_format, branch.BzrBranchFormat4):
356
            raise TestNotApplicable('Branch format 4 is not usable via HPSS.')
4617.3.1 by Robert Collins
Fix test_stacking tests for 2a as a default format. The change to 2a exposed some actual bugs, both in tests and bzrdir/branch code.
357
        source = self.make_branch('source')
358
        stack_on = self.make_stacked_on_matching(source)
4103.2.3 by Andrew Bennetts
Other tests for good luck.
359
        parent_bzrdir = self.make_bzrdir('.', format='default')
360
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
361
        url = self.make_smart_server('target').base
362
        target = source.bzrdir.sprout(url).open_branch()
4617.3.1 by Robert Collins
Fix test_stacking tests for 2a as a default format. The change to 2a exposed some actual bugs, both in tests and bzrdir/branch code.
363
        # When we sprout we upgrade the branch when there is a default stack_on
364
        # set by a config *and* the targeted branch supports stacking.
365
        if stack_on._format.supports_stacking():
4103.2.3 by Andrew Bennetts
Other tests for good luck.
366
            self.assertEqual('../stack-on', target.get_stacked_on_url())
367
        else:
368
            self.assertRaises(
369
                errors.UnstackableBranchFormat, target.get_stacked_on_url)
370
1551.19.47 by Aaron Bentley
Add test per JAM
371
    def prepare_stacked_on_fetch(self):
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
372
        stack_on = self.make_branch_and_tree('stack-on')
373
        stack_on.commit('first commit', rev_id='rev1')
374
        try:
375
            stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
376
        except unstackable_format_errors, e:
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
377
            raise TestNotApplicable('Format does not support stacking.')
378
        unstacked = self.make_repository('unstacked')
1551.19.47 by Aaron Bentley
Add test per JAM
379
        return stacked_dir.open_workingtree(), unstacked
380
381
    def test_fetch_copies_from_stacked_on(self):
382
        stacked, unstacked = self.prepare_stacked_on_fetch()
383
        unstacked.fetch(stacked.branch.repository, 'rev1')
384
        unstacked.get_revision('rev1')
385
386
    def test_fetch_copies_from_stacked_on_and_stacked(self):
387
        stacked, unstacked = self.prepare_stacked_on_fetch()
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
388
        tree = stacked.branch.create_checkout('local')
389
        tree.commit('second commit', rev_id='rev2')
1551.19.47 by Aaron Bentley
Add test per JAM
390
        unstacked.fetch(stacked.branch.repository, 'rev2')
391
        unstacked.get_revision('rev1')
392
        unstacked.get_revision('rev2')
3830.3.16 by Martin Pool
Add passing tests for iter_lines_added_or_present in stacked repos
393
        self.check_lines_added_or_present(stacked.branch, 'rev1')
394
        self.check_lines_added_or_present(stacked.branch, 'rev2')
3582.2.1 by Jonathan Lange
Fix up problems with fetching revisions. Almost entirely abentley's work.
395
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
396
    def test_autopack_when_stacked(self):
397
        # in bzr.dev as of 20080730, autopack was reported to fail in stacked
398
        # repositories because of problems with text deltas spanning physical
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
399
        # repository boundaries.  however, i didn't actually get this test to
400
        # fail on that code. -- mbp
3582.1.11 by Martin Pool
doc
401
        # see https://bugs.launchpad.net/bzr/+bug/252821
4617.3.1 by Robert Collins
Fix test_stacking tests for 2a as a default format. The change to 2a exposed some actual bugs, both in tests and bzrdir/branch code.
402
        stack_on = self.make_branch_and_tree('stack-on')
403
        if not stack_on.branch._format.supports_stacking():
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
404
            raise TestNotApplicable("%r does not support stacking"
405
                % self.branch_format)
3582.1.9 by Martin Pool
Make autopack-stacked test use larger files; still does not fail
406
        text_lines = ['line %d blah blah blah\n' % i for i in range(20)]
407
        self.build_tree_contents([('stack-on/a', ''.join(text_lines))])
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
408
        stack_on.add('a')
409
        stack_on.commit('base commit')
410
        stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
411
        stacked_branch = stacked_dir.open_branch()
412
        local_tree = stack_on.bzrdir.sprout('local').open_workingtree()
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
413
        for i in range(20):
3582.1.9 by Martin Pool
Make autopack-stacked test use larger files; still does not fail
414
            text_lines[0] = 'changed in %d\n' % i
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
415
            self.build_tree_contents([('local/a', ''.join(text_lines))])
416
            local_tree.commit('commit %d' % i)
417
            local_tree.branch.push(stacked_branch)
418
        stacked_branch.repository.pack()
419
        check.check_dwim(stacked_branch.base, False, True, True)
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
420
421
    def test_pull_delta_when_stacked(self):
422
        if not self.branch_format.supports_stacking():
423
            raise TestNotApplicable("%r does not support stacking"
424
                % self.branch_format)
425
        stack_on = self.make_branch_and_tree('stack-on')
426
        text_lines = ['line %d blah blah blah\n' % i for i in range(20)]
427
        self.build_tree_contents([('stack-on/a', ''.join(text_lines))])
428
        stack_on.add('a')
429
        stack_on.commit('base commit')
430
        # make a stacked branch from the mainline
431
        stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
432
        stacked_tree = stacked_dir.open_workingtree()
433
        # make a second non-stacked branch from the mainline
434
        other_dir = stack_on.bzrdir.sprout('other')
435
        other_tree = other_dir.open_workingtree()
436
        text_lines[9] = 'changed in other\n'
437
        self.build_tree_contents([('other/a', ''.join(text_lines))])
3830.3.16 by Martin Pool
Add passing tests for iter_lines_added_or_present in stacked repos
438
        stacked_revid = other_tree.commit('commit in other')
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
439
        # this should have generated a delta; try to pull that across
3582.1.15 by Martin Pool
Comments and tests for repository stacking
440
        # bug 252821 caused a RevisionNotPresent here...
441
        stacked_tree.pull(other_tree.branch)
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
442
        stacked_tree.branch.repository.pack()
4332.3.35 by Robert Collins
Fix failing tests.
443
        check.check_dwim(stacked_tree.branch.base, False, True, True)
3830.3.16 by Martin Pool
Add passing tests for iter_lines_added_or_present in stacked repos
444
        self.check_lines_added_or_present(stacked_tree.branch, stacked_revid)
3582.1.12 by Martin Pool
merge from trunk
445
3582.2.1 by Jonathan Lange
Fix up problems with fetching revisions. Almost entirely abentley's work.
446
    def test_fetch_revisions_with_file_changes(self):
447
        # Fetching revisions including file changes into a stacked branch
448
        # works without error.
449
        # Make the source tree.
450
        src_tree = self.make_branch_and_tree('src')
451
        self.build_tree_contents([('src/a', 'content')])
452
        src_tree.add('a')
453
        src_tree.commit('first commit')
454
455
        # Make the stacked-on branch.
456
        src_tree.bzrdir.sprout('stacked-on')
457
458
        # Make a branch stacked on it.
459
        target = self.make_branch('target')
460
        try:
461
            target.set_stacked_on_url('../stacked-on')
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
462
        except unstackable_format_errors, e:
3582.2.1 by Jonathan Lange
Fix up problems with fetching revisions. Almost entirely abentley's work.
463
            raise TestNotApplicable('Format does not support stacking.')
464
465
        # Change the source branch.
466
        self.build_tree_contents([('src/a', 'new content')])
467
        src_tree.commit('second commit', rev_id='rev2')
468
469
        # Fetch changes to the target.
470
        target.fetch(src_tree.branch)
471
        rtree = target.repository.revision_tree('rev2')
472
        rtree.lock_read()
473
        self.addCleanup(rtree.unlock)
474
        self.assertEqual('new content', rtree.get_file_by_path('a').read())
3830.3.16 by Martin Pool
Add passing tests for iter_lines_added_or_present in stacked repos
475
        self.check_lines_added_or_present(target, 'rev2')
3770.2.1 by Michael Hudson
test and feature
476
477
    def test_transform_fallback_location_hook(self):
478
        # The 'transform_fallback_location' branch hook allows us to inspect
479
        # and transform the URL of the fallback location for the branch.
480
        stack_on = self.make_branch('stack-on')
481
        stacked = self.make_branch('stacked')
482
        try:
483
            stacked.set_stacked_on_url('../stack-on')
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
484
        except unstackable_format_errors, e:
3770.2.1 by Michael Hudson
test and feature
485
            raise TestNotApplicable('Format does not support stacking.')
486
        self.get_transport().rename('stack-on', 'new-stack-on')
487
        hook_calls = []
488
        def hook(stacked_branch, url):
489
            hook_calls.append(url)
490
            return '../new-stack-on'
491
        branch.Branch.hooks.install_named_hook(
492
            'transform_fallback_location', hook, None)
493
        branch.Branch.open('stacked')
494
        self.assertEqual(['../stack-on'], hook_calls)
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
495
496
    def test_stack_on_repository_branch(self):
497
        # Stacking should work when the repo isn't co-located with the
498
        # stack-on branch.
499
        try:
500
            repo = self.make_repository('repo', shared=True)
501
        except errors.IncompatibleFormat:
502
            raise TestNotApplicable()
503
        # Avoid make_branch, which produces standalone branches.
504
        bzrdir = self.make_bzrdir('repo/stack-on')
3834.5.4 by John Arbash Meinel
Skip the stack_on_repository test for BranchReference branches.
505
        try:
506
            b = bzrdir.create_branch()
507
        except errors.UninitializableFormat:
508
            raise TestNotApplicable()
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
509
        transport = self.get_transport('stacked')
510
        b.bzrdir.clone_on_transport(transport, stacked_on=b.base)
3830.2.2 by Aaron Bentley
Add explanatory comment.
511
        # Ensure that opening the branch doesn't raise.
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
512
        branch.Branch.open(transport.base)
3928.3.1 by John Arbash Meinel
Fix Branch.open() so that for stacked branches we don't open multiple connections.
513
4419.1.2 by Andrew Bennetts
Add branch_implementations test for revision_history() on a stacked branch.
514
    def test_revision_history_of_stacked(self):
4419.1.6 by Andrew Bennetts
Add comments requested by Martin's review.
515
        # See <https://launchpad.net/bugs/380314>.
4419.1.2 by Andrew Bennetts
Add branch_implementations test for revision_history() on a stacked branch.
516
        stack_on = self.make_branch_and_tree('stack-on')
517
        stack_on.commit('first commit', rev_id='rev1')
518
        try:
519
            stacked_dir = stack_on.bzrdir.sprout(
520
                self.get_url('stacked'), stacked=True)
521
        except unstackable_format_errors, e:
522
            raise TestNotApplicable('Format does not support stacking.')
523
        try:
524
            stacked = stacked_dir.open_workingtree()
525
        except errors.NoWorkingTree:
526
            stacked = stacked_dir.open_branch().create_checkout(
527
                'stacked-checkout', lightweight=True)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
528
        tree = stacked.branch.create_checkout('local')
529
        tree.commit('second commit', rev_id='rev2')
4419.1.2 by Andrew Bennetts
Add branch_implementations test for revision_history() on a stacked branch.
530
        # Sanity check: stacked's repo should not contain rev1, otherwise this
531
        # test isn't testing what it's supposed to.
532
        repo = stacked.branch.repository.bzrdir.open_repository()
533
        repo.lock_read()
534
        self.addCleanup(repo.unlock)
535
        self.assertEqual({}, repo.get_parent_map(['rev1']))
536
        # revision_history should work, even though the history is spread over
537
        # multiple repositories.
538
        self.assertLength(2, stacked.branch.revision_history())
539
3928.3.1 by John Arbash Meinel
Fix Branch.open() so that for stacked branches we don't open multiple connections.
540
541
class TestStackingConnections(
542
    transport_util.TestCaseWithConnectionHookedTransport):
543
544
    def setUp(self):
545
        super(TestStackingConnections, self).setUp()
546
        try:
547
            base_tree = self.make_branch_and_tree('base',
548
                                                  format=self.bzrdir_format)
549
        except errors.UninitializableFormat, e:
550
            raise TestNotApplicable(e)
551
        stacked = self.make_branch('stacked', format=self.bzrdir_format)
552
        try:
553
            stacked.set_stacked_on_url(base_tree.branch.base)
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
554
        except unstackable_format_errors, e:
3928.3.1 by John Arbash Meinel
Fix Branch.open() so that for stacked branches we don't open multiple connections.
555
            raise TestNotApplicable(e)
556
        base_tree.commit('first', rev_id='rev-base')
557
        stacked.set_last_revision_info(1, 'rev-base')
558
        stacked_relative = self.make_branch('stacked_relative',
559
                                            format=self.bzrdir_format)
560
        stacked_relative.set_stacked_on_url('../base')
561
        stacked.set_last_revision_info(1, 'rev-base')
562
        self.start_logging_connections()
563
564
    def test_open_stacked(self):
565
        b = branch.Branch.open(self.get_url('stacked'))
566
        rev = b.repository.get_revision('rev-base')
567
        self.assertEqual(1, len(self.connections))
568
569
    def test_open_stacked_relative(self):
570
        b = branch.Branch.open(self.get_url('stacked_relative'))
571
        rev = b.repository.get_revision('rev-base')
572
        self.assertEqual(1, len(self.connections))