/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
5651.5.1 by Andrew Bennetts
Make 'bzr reconfigure --unstacked' fetch tagged revisions too. (#401646)
26
from bzrlib.tests import fixtures, 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"""
5651.5.1 by Andrew Bennetts
Make 'bzr reconfigure --unstacked' fetch tagged revisions too. (#401646)
179
        try:
180
            builder = self.make_branch_builder('trunk')
181
        except errors.UninitializableFormat:
182
            raise TestNotApplicable('uninitializeable format')
3537.3.4 by Martin Pool
Improved branch stacking tests
183
        # We have a mainline
5651.5.2 by Andrew Bennetts
Simplify new fixture slightly, and other test tweaks.
184
        trunk = fixtures.build_branch_with_non_ancestral_rev(builder)
5651.5.1 by Andrew Bennetts
Make 'bzr reconfigure --unstacked' fetch tagged revisions too. (#401646)
185
        mainline_revid = 'rev-1'
186
        # and make branch from it which is stacked (with no tags)
3537.3.4 by Martin Pool
Improved branch stacking tests
187
        try:
5651.5.1 by Andrew Bennetts
Make 'bzr reconfigure --unstacked' fetch tagged revisions too. (#401646)
188
            new_dir = trunk.bzrdir.sprout(self.get_url('newbranch'), stacked=True)
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
189
        except unstackable_format_errors, e:
3537.3.4 by Martin Pool
Improved branch stacking tests
190
            raise TestNotApplicable(e)
191
        # stacked repository
5651.5.1 by Andrew Bennetts
Make 'bzr reconfigure --unstacked' fetch tagged revisions too. (#401646)
192
        self.assertRevisionNotInRepository('newbranch', mainline_revid)
4509.3.17 by Martin Pool
test_unstack_fetches must put the stacked branch on the right transport to test remote formats
193
        # TODO: we'd like to commit in the stacked repository; that requires
194
        # some care (maybe a BranchBuilder) if it's remote and has no
195
        # workingtree
196
        ##newbranch_revid = new_dir.open_workingtree().commit('revision in '
197
            ##'newbranch')
3537.3.4 by Martin Pool
Improved branch stacking tests
198
        # now when we unstack that should implicitly fetch, to make sure that
199
        # the branch will still work
200
        new_branch = new_dir.open_branch()
5651.5.2 by Andrew Bennetts
Simplify new fixture slightly, and other test tweaks.
201
        try:
202
            new_branch.tags.set_tag('tag-a', 'rev-2')
203
        except errors.TagsNotSupported:
204
            tags_supported = False
205
        else:
206
            tags_supported = True
3537.3.4 by Martin Pool
Improved branch stacking tests
207
        new_branch.set_stacked_on_url(None)
5651.5.1 by Andrew Bennetts
Make 'bzr reconfigure --unstacked' fetch tagged revisions too. (#401646)
208
        self.assertRevisionInRepository('newbranch', mainline_revid)
3537.3.4 by Martin Pool
Improved branch stacking tests
209
        # of course it's still in the mainline
5651.5.1 by Andrew Bennetts
Make 'bzr reconfigure --unstacked' fetch tagged revisions too. (#401646)
210
        self.assertRevisionInRepository('trunk', mainline_revid)
5651.5.2 by Andrew Bennetts
Simplify new fixture slightly, and other test tweaks.
211
        if tags_supported:
212
            # the tagged revision in trunk is now in newbranch too
213
            self.assertRevisionInRepository('newbranch', 'rev-2')
3537.3.4 by Martin Pool
Improved branch stacking tests
214
        # and now we're no longer stacked
5651.5.2 by Andrew Bennetts
Simplify new fixture slightly, and other test tweaks.
215
        self.assertRaises(errors.NotStacked, 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.
216
5325.1.4 by Andrew Bennetts
Improve comments.
217
    def test_unstack_already_locked(self):
5325.1.1 by Andrew Bennetts
Add failing test.
218
        """Removing the stacked-on branch with an already write-locked branch
219
        works.
220
221
        This was bug 551525.
222
        """
223
        try:
224
            stacked_bzrdir = self.make_stacked_bzrdir()
225
        except unstackable_format_errors, e:
226
            raise TestNotApplicable(e)
227
        stacked_branch = stacked_bzrdir.open_branch()
228
        stacked_branch.lock_write()
229
        stacked_branch.set_stacked_on_url(None)
230
        stacked_branch.unlock()
231
5325.1.4 by Andrew Bennetts
Improve comments.
232
    def test_unstack_already_multiple_locked(self):
233
        """Unstacking a branch preserves the lock count (even though it
234
        replaces the br.repository object).
235
236
        This is a more extreme variation of test_unstack_already_locked.
237
        """
5325.1.2 by Andrew Bennetts
Add another failing test.
238
        try:
239
            stacked_bzrdir = self.make_stacked_bzrdir()
240
        except unstackable_format_errors, e:
241
            raise TestNotApplicable(e)
242
        stacked_branch = stacked_bzrdir.open_branch()
243
        stacked_branch.lock_write()
244
        stacked_branch.lock_write()
245
        stacked_branch.lock_write()
246
        stacked_branch.set_stacked_on_url(None)
247
        stacked_branch.unlock()
248
        stacked_branch.unlock()
249
        stacked_branch.unlock()
250
3567.3.4 by Michael Hudson
make test a lot better
251
    def make_stacked_bzrdir(self, in_directory=None):
3567.3.7 by Michael Hudson
better docstring
252
        """Create a stacked branch and return its bzrdir.
3567.3.4 by Michael Hudson
make test a lot better
253
254
        :param in_directory: If not None, create a directory of this
255
            name and create the stacking and stacked-on bzrdirs in
256
            this directory.
257
        """
258
        if in_directory is not None:
259
            self.get_transport().mkdir(in_directory)
260
            prefix = in_directory + '/'
261
        else:
262
            prefix = ''
263
        tree = self.make_branch_and_tree(prefix + 'stacked-on')
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
264
        tree.commit('Added foo')
265
        stacked_bzrdir = tree.branch.bzrdir.sprout(
5325.1.1 by Andrew Bennetts
Add failing test.
266
            self.get_url(prefix + 'stacked'), tree.branch.last_revision(),
267
            stacked=True)
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
268
        return stacked_bzrdir
269
270
    def test_clone_from_stacked_branch_preserve_stacking(self):
3242.3.24 by Aaron Bentley
Fix test failures
271
        # We can clone from the bzrdir of a stacked branch. If
272
        # preserve_stacking is True, the cloned branch is stacked on the
273
        # same branch as the original.
3242.3.21 by Jonathan Lange
Preserve stacking in clone
274
        try:
3567.3.4 by Michael Hudson
make test a lot better
275
            stacked_bzrdir = self.make_stacked_bzrdir()
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
276
        except unstackable_format_errors, e:
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
277
            raise TestNotApplicable(e)
3242.3.24 by Aaron Bentley
Fix test failures
278
        cloned_bzrdir = stacked_bzrdir.clone('cloned', preserve_stacking=True)
3242.3.21 by Jonathan Lange
Preserve stacking in clone
279
        try:
280
            self.assertEqual(
3537.3.5 by Martin Pool
merge trunk including stacking policy
281
                stacked_bzrdir.open_branch().get_stacked_on_url(),
282
                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'
283
        except unstackable_format_errors, e:
3242.3.21 by Jonathan Lange
Preserve stacking in clone
284
            pass
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
285
3567.3.4 by Michael Hudson
make test a lot better
286
    def test_clone_from_branch_stacked_on_relative_url_preserve_stacking(self):
287
        # If a branch's stacked-on url is relative, we can still clone
288
        # from it with preserve_stacking True and get a branch stacked
289
        # on an appropriately adjusted relative url.
3567.3.3 by Michael Hudson
very hackish test
290
        try:
3567.3.4 by Michael Hudson
make test a lot better
291
            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'
292
        except unstackable_format_errors, e:
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
293
            raise TestNotApplicable(e)
3567.3.4 by Michael Hudson
make test a lot better
294
        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.
295
        cloned_bzrdir = stacked_bzrdir.clone(
296
            self.get_url('cloned'), preserve_stacking=True)
3567.3.4 by Michael Hudson
make test a lot better
297
        self.assertEqual(
298
            '../dir/stacked-on',
299
            cloned_bzrdir.open_branch().get_stacked_on_url())
3567.3.3 by Michael Hudson
very hackish test
300
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
301
    def test_clone_from_stacked_branch_no_preserve_stacking(self):
302
        try:
3567.3.4 by Michael Hudson
make test a lot better
303
            stacked_bzrdir = self.make_stacked_bzrdir()
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
304
        except unstackable_format_errors, e:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
305
            # not a testable combination.
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
306
            raise TestNotApplicable(e)
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
307
        cloned_unstacked_bzrdir = stacked_bzrdir.clone('cloned-unstacked',
308
            preserve_stacking=False)
3242.3.24 by Aaron Bentley
Fix test failures
309
        unstacked_branch = cloned_unstacked_bzrdir.open_branch()
3242.3.37 by Aaron Bentley
Updates from reviews
310
        self.assertRaises((errors.NotStacked, errors.UnstackableBranchFormat),
3537.3.5 by Martin Pool
merge trunk including stacking policy
311
                          unstacked_branch.get_stacked_on_url)
3242.3.37 by Aaron Bentley
Updates from reviews
312
313
    def test_no_op_preserve_stacking(self):
314
        """With no stacking, preserve_stacking should be a no-op."""
315
        branch = self.make_branch('source')
316
        cloned_bzrdir = branch.bzrdir.clone('cloned', preserve_stacking=True)
317
        self.assertRaises((errors.NotStacked, errors.UnstackableBranchFormat),
3537.3.5 by Martin Pool
merge trunk including stacking policy
318
                          cloned_bzrdir.open_branch().get_stacked_on_url)
3242.3.37 by Aaron Bentley
Updates from reviews
319
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.
320
    def make_stacked_on_matching(self, source):
321
        if source.repository.supports_rich_root():
322
            if source.repository._format.supports_chks:
323
                format = "2a"
324
            else:
325
                format = "1.9-rich-root"
326
        else:
327
            format = "1.9"
328
        return self.make_branch('stack-on', format)
329
3242.3.37 by Aaron Bentley
Updates from reviews
330
    def test_sprout_stacking_policy_handling(self):
331
        """Obey policy where possible, ignore otherwise."""
5673.1.3 by Jelmer Vernooij
Change flexible_components to fixed_components.
332
        if self.bzrdir_format.fixed_components:
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.
333
            raise TestNotApplicable('Branch format 4 does not autoupgrade.')
334
        source = self.make_branch('source')
335
        stack_on = self.make_stacked_on_matching(source)
3242.3.37 by Aaron Bentley
Updates from reviews
336
        parent_bzrdir = self.make_bzrdir('.', format='default')
337
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
338
        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.
339
        # When we sprout we upgrade the branch when there is a default stack_on
340
        # set by a config *and* the targeted branch supports stacking.
341
        if stack_on._format.supports_stacking():
3641.1.1 by John Arbash Meinel
Merge in 1.6rc5 and revert disabling default stack on policy
342
            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.
343
        else:
344
            self.assertRaises(
345
                errors.UnstackableBranchFormat, target.get_stacked_on_url)
3242.3.38 by Aaron Bentley
Enhance tests
346
347
    def test_clone_stacking_policy_handling(self):
348
        """Obey policy where possible, ignore otherwise."""
5673.1.3 by Jelmer Vernooij
Change flexible_components to fixed_components.
349
        if self.bzrdir_format.fixed_components:
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.
350
            raise TestNotApplicable('Branch format 4 does not autoupgrade.')
351
        source = self.make_branch('source')
352
        stack_on = self.make_stacked_on_matching(source)
3242.3.38 by Aaron Bentley
Enhance tests
353
        parent_bzrdir = self.make_bzrdir('.', format='default')
354
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
355
        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.
356
        # When we clone we upgrade the branch when there is a default stack_on
357
        # set by a config *and* the targeted branch supports stacking.
358
        if stack_on._format.supports_stacking():
3641.1.1 by John Arbash Meinel
Merge in 1.6rc5 and revert disabling default stack on policy
359
            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.
360
        else:
361
            self.assertRaises(
362
                errors.UnstackableBranchFormat, target.get_stacked_on_url)
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
363
4103.2.3 by Andrew Bennetts
Other tests for good luck.
364
    def test_sprout_to_smart_server_stacking_policy_handling(self):
365
        """Obey policy where possible, ignore otherwise."""
5674.1.1 by Jelmer Vernooij
Add supports_leave_lock flag to BranchFormat and RepositoryFormat.
366
        if not self.branch_format.supports_leaving_lock():
367
            raise TestNotApplicable('Branch format 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.
368
        source = self.make_branch('source')
369
        stack_on = self.make_stacked_on_matching(source)
4103.2.3 by Andrew Bennetts
Other tests for good luck.
370
        parent_bzrdir = self.make_bzrdir('.', format='default')
371
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
372
        url = self.make_smart_server('target').base
373
        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.
374
        # When we sprout we upgrade the branch when there is a default stack_on
375
        # set by a config *and* the targeted branch supports stacking.
376
        if stack_on._format.supports_stacking():
4103.2.3 by Andrew Bennetts
Other tests for good luck.
377
            self.assertEqual('../stack-on', target.get_stacked_on_url())
378
        else:
379
            self.assertRaises(
380
                errors.UnstackableBranchFormat, target.get_stacked_on_url)
381
1551.19.47 by Aaron Bentley
Add test per JAM
382
    def prepare_stacked_on_fetch(self):
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
383
        stack_on = self.make_branch_and_tree('stack-on')
384
        stack_on.commit('first commit', rev_id='rev1')
385
        try:
386
            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'
387
        except unstackable_format_errors, e:
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
388
            raise TestNotApplicable('Format does not support stacking.')
389
        unstacked = self.make_repository('unstacked')
1551.19.47 by Aaron Bentley
Add test per JAM
390
        return stacked_dir.open_workingtree(), unstacked
391
392
    def test_fetch_copies_from_stacked_on(self):
393
        stacked, unstacked = self.prepare_stacked_on_fetch()
394
        unstacked.fetch(stacked.branch.repository, 'rev1')
395
        unstacked.get_revision('rev1')
396
397
    def test_fetch_copies_from_stacked_on_and_stacked(self):
398
        stacked, unstacked = self.prepare_stacked_on_fetch()
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
399
        tree = stacked.branch.create_checkout('local')
400
        tree.commit('second commit', rev_id='rev2')
1551.19.47 by Aaron Bentley
Add test per JAM
401
        unstacked.fetch(stacked.branch.repository, 'rev2')
402
        unstacked.get_revision('rev1')
403
        unstacked.get_revision('rev2')
3830.3.16 by Martin Pool
Add passing tests for iter_lines_added_or_present in stacked repos
404
        self.check_lines_added_or_present(stacked.branch, 'rev1')
405
        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.
406
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
407
    def test_autopack_when_stacked(self):
408
        # in bzr.dev as of 20080730, autopack was reported to fail in stacked
409
        # repositories because of problems with text deltas spanning physical
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
410
        # repository boundaries.  however, i didn't actually get this test to
411
        # fail on that code. -- mbp
3582.1.11 by Martin Pool
doc
412
        # 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.
413
        stack_on = self.make_branch_and_tree('stack-on')
414
        if not stack_on.branch._format.supports_stacking():
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
415
            raise TestNotApplicable("%r does not support stacking"
416
                % self.branch_format)
3582.1.9 by Martin Pool
Make autopack-stacked test use larger files; still does not fail
417
        text_lines = ['line %d blah blah blah\n' % i for i in range(20)]
418
        self.build_tree_contents([('stack-on/a', ''.join(text_lines))])
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
419
        stack_on.add('a')
420
        stack_on.commit('base commit')
421
        stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
422
        stacked_branch = stacked_dir.open_branch()
423
        local_tree = stack_on.bzrdir.sprout('local').open_workingtree()
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
424
        for i in range(20):
3582.1.9 by Martin Pool
Make autopack-stacked test use larger files; still does not fail
425
            text_lines[0] = 'changed in %d\n' % i
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
426
            self.build_tree_contents([('local/a', ''.join(text_lines))])
427
            local_tree.commit('commit %d' % i)
428
            local_tree.branch.push(stacked_branch)
429
        stacked_branch.repository.pack()
430
        check.check_dwim(stacked_branch.base, False, True, True)
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
431
432
    def test_pull_delta_when_stacked(self):
433
        if not self.branch_format.supports_stacking():
434
            raise TestNotApplicable("%r does not support stacking"
435
                % self.branch_format)
436
        stack_on = self.make_branch_and_tree('stack-on')
437
        text_lines = ['line %d blah blah blah\n' % i for i in range(20)]
438
        self.build_tree_contents([('stack-on/a', ''.join(text_lines))])
439
        stack_on.add('a')
440
        stack_on.commit('base commit')
441
        # make a stacked branch from the mainline
442
        stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
443
        stacked_tree = stacked_dir.open_workingtree()
444
        # make a second non-stacked branch from the mainline
445
        other_dir = stack_on.bzrdir.sprout('other')
446
        other_tree = other_dir.open_workingtree()
447
        text_lines[9] = 'changed in other\n'
448
        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
449
        stacked_revid = other_tree.commit('commit in other')
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
450
        # this should have generated a delta; try to pull that across
3582.1.15 by Martin Pool
Comments and tests for repository stacking
451
        # bug 252821 caused a RevisionNotPresent here...
452
        stacked_tree.pull(other_tree.branch)
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
453
        stacked_tree.branch.repository.pack()
4332.3.35 by Robert Collins
Fix failing tests.
454
        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
455
        self.check_lines_added_or_present(stacked_tree.branch, stacked_revid)
3582.1.12 by Martin Pool
merge from trunk
456
3582.2.1 by Jonathan Lange
Fix up problems with fetching revisions. Almost entirely abentley's work.
457
    def test_fetch_revisions_with_file_changes(self):
458
        # Fetching revisions including file changes into a stacked branch
459
        # works without error.
460
        # Make the source tree.
461
        src_tree = self.make_branch_and_tree('src')
462
        self.build_tree_contents([('src/a', 'content')])
463
        src_tree.add('a')
464
        src_tree.commit('first commit')
465
466
        # Make the stacked-on branch.
467
        src_tree.bzrdir.sprout('stacked-on')
468
469
        # Make a branch stacked on it.
470
        target = self.make_branch('target')
471
        try:
472
            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'
473
        except unstackable_format_errors, e:
3582.2.1 by Jonathan Lange
Fix up problems with fetching revisions. Almost entirely abentley's work.
474
            raise TestNotApplicable('Format does not support stacking.')
475
476
        # Change the source branch.
477
        self.build_tree_contents([('src/a', 'new content')])
478
        src_tree.commit('second commit', rev_id='rev2')
479
480
        # Fetch changes to the target.
481
        target.fetch(src_tree.branch)
482
        rtree = target.repository.revision_tree('rev2')
483
        rtree.lock_read()
484
        self.addCleanup(rtree.unlock)
485
        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
486
        self.check_lines_added_or_present(target, 'rev2')
3770.2.1 by Michael Hudson
test and feature
487
488
    def test_transform_fallback_location_hook(self):
489
        # The 'transform_fallback_location' branch hook allows us to inspect
490
        # and transform the URL of the fallback location for the branch.
491
        stack_on = self.make_branch('stack-on')
492
        stacked = self.make_branch('stacked')
493
        try:
494
            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'
495
        except unstackable_format_errors, e:
3770.2.1 by Michael Hudson
test and feature
496
            raise TestNotApplicable('Format does not support stacking.')
497
        self.get_transport().rename('stack-on', 'new-stack-on')
498
        hook_calls = []
499
        def hook(stacked_branch, url):
500
            hook_calls.append(url)
501
            return '../new-stack-on'
502
        branch.Branch.hooks.install_named_hook(
503
            'transform_fallback_location', hook, None)
504
        branch.Branch.open('stacked')
505
        self.assertEqual(['../stack-on'], hook_calls)
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
506
507
    def test_stack_on_repository_branch(self):
508
        # Stacking should work when the repo isn't co-located with the
509
        # stack-on branch.
510
        try:
511
            repo = self.make_repository('repo', shared=True)
512
        except errors.IncompatibleFormat:
513
            raise TestNotApplicable()
514
        # Avoid make_branch, which produces standalone branches.
515
        bzrdir = self.make_bzrdir('repo/stack-on')
3834.5.4 by John Arbash Meinel
Skip the stack_on_repository test for BranchReference branches.
516
        try:
517
            b = bzrdir.create_branch()
518
        except errors.UninitializableFormat:
519
            raise TestNotApplicable()
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
520
        transport = self.get_transport('stacked')
521
        b.bzrdir.clone_on_transport(transport, stacked_on=b.base)
3830.2.2 by Aaron Bentley
Add explanatory comment.
522
        # Ensure that opening the branch doesn't raise.
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
523
        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.
524
4419.1.2 by Andrew Bennetts
Add branch_implementations test for revision_history() on a stacked branch.
525
    def test_revision_history_of_stacked(self):
4419.1.6 by Andrew Bennetts
Add comments requested by Martin's review.
526
        # See <https://launchpad.net/bugs/380314>.
4419.1.2 by Andrew Bennetts
Add branch_implementations test for revision_history() on a stacked branch.
527
        stack_on = self.make_branch_and_tree('stack-on')
528
        stack_on.commit('first commit', rev_id='rev1')
529
        try:
530
            stacked_dir = stack_on.bzrdir.sprout(
531
                self.get_url('stacked'), stacked=True)
532
        except unstackable_format_errors, e:
533
            raise TestNotApplicable('Format does not support stacking.')
534
        try:
535
            stacked = stacked_dir.open_workingtree()
536
        except errors.NoWorkingTree:
537
            stacked = stacked_dir.open_branch().create_checkout(
538
                'stacked-checkout', lightweight=True)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
539
        tree = stacked.branch.create_checkout('local')
540
        tree.commit('second commit', rev_id='rev2')
4419.1.2 by Andrew Bennetts
Add branch_implementations test for revision_history() on a stacked branch.
541
        # Sanity check: stacked's repo should not contain rev1, otherwise this
542
        # test isn't testing what it's supposed to.
543
        repo = stacked.branch.repository.bzrdir.open_repository()
544
        repo.lock_read()
545
        self.addCleanup(repo.unlock)
546
        self.assertEqual({}, repo.get_parent_map(['rev1']))
547
        # revision_history should work, even though the history is spread over
548
        # multiple repositories.
549
        self.assertLength(2, stacked.branch.revision_history())
550
3928.3.1 by John Arbash Meinel
Fix Branch.open() so that for stacked branches we don't open multiple connections.
551
552
class TestStackingConnections(
553
    transport_util.TestCaseWithConnectionHookedTransport):
554
555
    def setUp(self):
556
        super(TestStackingConnections, self).setUp()
557
        try:
558
            base_tree = self.make_branch_and_tree('base',
559
                                                  format=self.bzrdir_format)
560
        except errors.UninitializableFormat, e:
561
            raise TestNotApplicable(e)
562
        stacked = self.make_branch('stacked', format=self.bzrdir_format)
563
        try:
564
            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'
565
        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.
566
            raise TestNotApplicable(e)
567
        base_tree.commit('first', rev_id='rev-base')
568
        stacked.set_last_revision_info(1, 'rev-base')
569
        stacked_relative = self.make_branch('stacked_relative',
570
                                            format=self.bzrdir_format)
571
        stacked_relative.set_stacked_on_url('../base')
572
        stacked.set_last_revision_info(1, 'rev-base')
573
        self.start_logging_connections()
574
575
    def test_open_stacked(self):
576
        b = branch.Branch.open(self.get_url('stacked'))
577
        rev = b.repository.get_revision('rev-base')
578
        self.assertEqual(1, len(self.connections))
579
580
    def test_open_stacked_relative(self):
581
        b = branch.Branch.open(self.get_url('stacked_relative'))
582
        rev = b.repository.get_revision('rev-base')
583
        self.assertEqual(1, len(self.connections))