/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
3221.11.3 by Robert Collins
Add missing test script.
1
# Copyright (C) 2008 Canonical Ltd
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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,
22
    errors,
23
    )
24
from bzrlib.revision import NULL_REVISION
3793.1.2 by Andrew Bennetts
Add test showing that stacking from the smart server works.
25
from bzrlib.smart import server
3928.3.1 by John Arbash Meinel
Fix Branch.open() so that for stacked branches we don't open multiple connections.
26
from bzrlib.tests import TestNotApplicable, KnownFailure, transport_util
3221.11.3 by Robert Collins
Add missing test script.
27
from bzrlib.tests.branch_implementations import TestCaseWithBranch
3793.1.2 by Andrew Bennetts
Add test showing that stacking from the smart server works.
28
from bzrlib.transport import get_transport
3221.11.3 by Robert Collins
Add missing test script.
29
30
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
31
unstackable_format_errors = (
3928.3.1 by John Arbash Meinel
Fix Branch.open() so that for stacked branches we don't open multiple connections.
32
    errors.UnstackableBranchFormat,
33
    errors.UnstackableRepositoryFormat,
34
    )
35
36
3221.11.3 by Robert Collins
Add missing test script.
37
class TestStacking(TestCaseWithBranch):
38
3830.3.16 by Martin Pool
Add passing tests for iter_lines_added_or_present in stacked repos
39
    def check_lines_added_or_present(self, stacked_branch, revid):
40
        # similar to a failure seen in bug 288751 by mbp 20081120
41
        stacked_repo = stacked_branch.repository
42
        stacked_repo.lock_read()
43
        try:
44
            list(stacked_repo.inventories.iter_lines_added_or_present_in_keys(
45
                    [(revid,)]))
46
        finally:
47
            stacked_repo.unlock()
48
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
49
    def test_get_set_stacked_on_url(self):
3221.11.3 by Robert Collins
Add missing test script.
50
        # branches must either:
51
        # raise UnstackableBranchFormat or
52
        # raise UnstackableRepositoryFormat or
53
        # permit stacking to be done and then return the stacked location.
54
        branch = self.make_branch('branch')
55
        target = self.make_branch('target')
56
        try:
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
57
            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'
58
        except unstackable_format_errors:
3221.11.3 by Robert Collins
Add missing test script.
59
            # 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'
60
            self.assertRaises(unstackable_format_errors, branch.get_stacked_on_url)
4103.2.3 by Andrew Bennetts
Other tests for good luck.
61
            self.assertFalse(branch._format.supports_stacking())
3221.11.3 by Robert Collins
Add missing test script.
62
            return
4103.2.3 by Andrew Bennetts
Other tests for good luck.
63
        self.assertTrue(branch._format.supports_stacking())
3221.11.3 by Robert Collins
Add missing test script.
64
        # now we have a stacked branch:
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
65
        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
66
        branch.set_stacked_on_url(None)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
67
        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.
68
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
69
    def test_get_set_stacked_on_relative(self):
70
        # Branches can be stacked on other branches using relative paths.
71
        branch = self.make_branch('branch')
72
        target = self.make_branch('target')
73
        try:
3537.3.5 by Martin Pool
merge trunk including stacking policy
74
            branch.set_stacked_on_url('../target')
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
75
        except unstackable_format_errors:
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
76
            # 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'
77
            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.
78
            return
3537.3.5 by Martin Pool
merge trunk including stacking policy
79
        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.
80
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
81
    def assertRevisionInRepository(self, repo_path, revid):
82
        """Check that a revision is in a repository, disregarding stacking."""
83
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
84
        self.assertTrue(repo.has_revision(revid))
85
86
    def assertRevisionNotInRepository(self, repo_path, revid):
87
        """Check that a revision is not in a repository, disregarding stacking."""
88
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
89
        self.assertFalse(repo.has_revision(revid))
90
91
    def test_get_graph_stacked(self):
92
        """A stacked repository shows the graph of its parent."""
93
        trunk_tree = self.make_branch_and_tree('mainline')
94
        trunk_revid = trunk_tree.commit('mainline')
95
        # make a new branch, and stack on the existing one.  we don't use
96
        # sprout(stacked=True) here because if that is buggy and copies data
97
        # it would cause a false pass of this test.
98
        new_branch = self.make_branch('new_branch')
99
        try:
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
100
            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'
101
        except unstackable_format_errors, e:
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
102
            raise TestNotApplicable(e)
103
        # reading the graph from the stacked branch's repository should see
104
        # data from the stacked-on branch
105
        new_repo = new_branch.repository
106
        new_repo.lock_read()
107
        try:
108
            self.assertEqual(new_repo.get_parent_map([trunk_revid]),
109
                {trunk_revid: (NULL_REVISION, )})
110
        finally:
111
            new_repo.unlock()
112
113
    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.
114
        # We have a mainline
115
        trunk_tree = self.make_branch_and_tree('mainline')
116
        trunk_revid = trunk_tree.commit('mainline')
3221.18.4 by Ian Clatworthy
shallow -> stacked
117
        # 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.
118
        try:
3221.18.4 by Ian Clatworthy
shallow -> stacked
119
            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'
120
        except unstackable_format_errors, e:
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
121
            raise TestNotApplicable(e)
122
        # stacked repository
123
        self.assertRevisionNotInRepository('newbranch', trunk_revid)
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.
124
        new_tree = new_dir.open_workingtree()
3537.3.4 by Martin Pool
Improved branch stacking tests
125
        new_branch_revid = new_tree.commit('something local')
126
        self.assertRevisionNotInRepository('mainline', new_branch_revid)
127
        self.assertRevisionInRepository('newbranch', new_branch_revid)
128
3793.1.2 by Andrew Bennetts
Add test showing that stacking from the smart server works.
129
    # XXX: this helper probably belongs on TestCaseWithTransport
130
    def make_smart_server(self, path):
131
        smart_server = server.SmartTCPServer_for_testing()
132
        smart_server.setUp(self.get_server())
133
        remote_transport = get_transport(smart_server.get_url()).clone(path)
134
        self.addCleanup(smart_server.tearDown)
135
        return remote_transport
136
137
    def test_sprout_stacked_from_smart_server(self):
138
        if isinstance(self.branch_format, branch.BzrBranchFormat4):
139
            raise TestNotApplicable('Branch format 4 is not usable via HPSS.')
140
        # We have a mainline
141
        trunk_tree = self.make_branch_and_tree('mainline')
142
        trunk_revid = trunk_tree.commit('mainline')
143
        # Make sure that we can make a stacked branch from it
144
        try:
145
            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'
146
        except unstackable_format_errors, e:
3793.1.2 by Andrew Bennetts
Add test showing that stacking from the smart server works.
147
            raise TestNotApplicable(e)
148
        # Now serve the original mainline from a smart server
149
        remote_transport = self.make_smart_server('mainline')
150
        remote_bzrdir = bzrdir.BzrDir.open_from_transport(remote_transport)
151
        # and make branch from the smart server which is stacked
152
        new_dir = remote_bzrdir.sprout('newbranch', stacked=True)
153
        # stacked repository
154
        self.assertRevisionNotInRepository('newbranch', trunk_revid)
155
        new_tree = new_dir.open_workingtree()
156
        new_branch_revid = new_tree.commit('something local')
157
        self.assertRevisionNotInRepository('mainline', new_branch_revid)
158
        self.assertRevisionInRepository('newbranch', new_branch_revid)
159
3537.3.4 by Martin Pool
Improved branch stacking tests
160
    def test_unstack_fetches(self):
161
        """Removing the stacked-on branch pulls across all data"""
162
        # We have a mainline
163
        trunk_tree = self.make_branch_and_tree('mainline')
164
        trunk_revid = trunk_tree.commit('revision on mainline')
165
        # and make branch from it which is stacked
166
        try:
167
            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'
168
        except unstackable_format_errors, e:
3537.3.4 by Martin Pool
Improved branch stacking tests
169
            raise TestNotApplicable(e)
170
        # stacked repository
171
        self.assertRevisionNotInRepository('newbranch', trunk_revid)
172
        # now when we unstack that should implicitly fetch, to make sure that
173
        # the branch will still work
174
        new_branch = new_dir.open_branch()
175
        new_branch.set_stacked_on_url(None)
176
        self.assertRevisionInRepository('newbranch', trunk_revid)
177
        # of course it's still in the mainline
178
        self.assertRevisionInRepository('mainline', trunk_revid)
179
        # and now we're no longer stacked
3537.3.5 by Martin Pool
merge trunk including stacking policy
180
        self.assertRaises(errors.NotStacked,
181
            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.
182
3567.3.4 by Michael Hudson
make test a lot better
183
    def make_stacked_bzrdir(self, in_directory=None):
3567.3.7 by Michael Hudson
better docstring
184
        """Create a stacked branch and return its bzrdir.
3567.3.4 by Michael Hudson
make test a lot better
185
186
        :param in_directory: If not None, create a directory of this
187
            name and create the stacking and stacked-on bzrdirs in
188
            this directory.
189
        """
190
        if in_directory is not None:
191
            self.get_transport().mkdir(in_directory)
192
            prefix = in_directory + '/'
193
        else:
194
            prefix = ''
195
        tree = self.make_branch_and_tree(prefix + 'stacked-on')
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
196
        tree.commit('Added foo')
197
        stacked_bzrdir = tree.branch.bzrdir.sprout(
3567.3.4 by Michael Hudson
make test a lot better
198
            prefix + 'stacked', tree.branch.last_revision(), stacked=True)
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
199
        return stacked_bzrdir
200
201
    def test_clone_from_stacked_branch_preserve_stacking(self):
3242.3.24 by Aaron Bentley
Fix test failures
202
        # We can clone from the bzrdir of a stacked branch. If
203
        # preserve_stacking is True, the cloned branch is stacked on the
204
        # same branch as the original.
3242.3.21 by Jonathan Lange
Preserve stacking in clone
205
        try:
3567.3.4 by Michael Hudson
make test a lot better
206
            stacked_bzrdir = self.make_stacked_bzrdir()
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
207
        except unstackable_format_errors, e:
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
208
            raise TestNotApplicable(e)
3242.3.24 by Aaron Bentley
Fix test failures
209
        cloned_bzrdir = stacked_bzrdir.clone('cloned', preserve_stacking=True)
3242.3.21 by Jonathan Lange
Preserve stacking in clone
210
        try:
211
            self.assertEqual(
3537.3.5 by Martin Pool
merge trunk including stacking policy
212
                stacked_bzrdir.open_branch().get_stacked_on_url(),
213
                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'
214
        except unstackable_format_errors, e:
3242.3.21 by Jonathan Lange
Preserve stacking in clone
215
            pass
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
216
3567.3.4 by Michael Hudson
make test a lot better
217
    def test_clone_from_branch_stacked_on_relative_url_preserve_stacking(self):
218
        # If a branch's stacked-on url is relative, we can still clone
219
        # from it with preserve_stacking True and get a branch stacked
220
        # on an appropriately adjusted relative url.
3567.3.3 by Michael Hudson
very hackish test
221
        try:
3567.3.4 by Michael Hudson
make test a lot better
222
            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'
223
        except unstackable_format_errors, e:
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
224
            raise TestNotApplicable(e)
3567.3.4 by Michael Hudson
make test a lot better
225
        stacked_bzrdir.open_branch().set_stacked_on_url('../stacked-on')
3567.3.3 by Michael Hudson
very hackish test
226
        cloned_bzrdir = stacked_bzrdir.clone('cloned', preserve_stacking=True)
3567.3.4 by Michael Hudson
make test a lot better
227
        self.assertEqual(
228
            '../dir/stacked-on',
229
            cloned_bzrdir.open_branch().get_stacked_on_url())
3567.3.3 by Michael Hudson
very hackish test
230
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
231
    def test_clone_from_stacked_branch_no_preserve_stacking(self):
232
        try:
3567.3.4 by Michael Hudson
make test a lot better
233
            stacked_bzrdir = self.make_stacked_bzrdir()
3928.3.3 by John Arbash Meinel
Change the name of 'old_format_errors' to 'unstackable_format_errors'
234
        except unstackable_format_errors, e:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
235
            # not a testable combination.
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
236
            raise TestNotApplicable(e)
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
237
        cloned_unstacked_bzrdir = stacked_bzrdir.clone('cloned-unstacked',
238
            preserve_stacking=False)
3242.3.24 by Aaron Bentley
Fix test failures
239
        unstacked_branch = cloned_unstacked_bzrdir.open_branch()
3242.3.37 by Aaron Bentley
Updates from reviews
240
        self.assertRaises((errors.NotStacked, errors.UnstackableBranchFormat),
3537.3.5 by Martin Pool
merge trunk including stacking policy
241
                          unstacked_branch.get_stacked_on_url)
3242.3.37 by Aaron Bentley
Updates from reviews
242
243
    def test_no_op_preserve_stacking(self):
244
        """With no stacking, preserve_stacking should be a no-op."""
245
        branch = self.make_branch('source')
246
        cloned_bzrdir = branch.bzrdir.clone('cloned', preserve_stacking=True)
247
        self.assertRaises((errors.NotStacked, errors.UnstackableBranchFormat),
3537.3.5 by Martin Pool
merge trunk including stacking policy
248
                          cloned_bzrdir.open_branch().get_stacked_on_url)
3242.3.37 by Aaron Bentley
Updates from reviews
249
250
    def test_sprout_stacking_policy_handling(self):
251
        """Obey policy where possible, ignore otherwise."""
252
        stack_on = self.make_branch('stack-on')
253
        parent_bzrdir = self.make_bzrdir('.', format='default')
254
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
255
        source = self.make_branch('source')
256
        target = source.bzrdir.sprout('target').open_branch()
4103.2.1 by Andrew Bennetts
Make clone/sprout stacking policy tests a little more precise.
257
        if self.branch_format.supports_stacking():
3641.1.1 by John Arbash Meinel
Merge in 1.6rc5 and revert disabling default stack on policy
258
            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.
259
        else:
260
            self.assertRaises(
261
                errors.UnstackableBranchFormat, target.get_stacked_on_url)
3242.3.38 by Aaron Bentley
Enhance tests
262
263
    def test_clone_stacking_policy_handling(self):
264
        """Obey policy where possible, ignore otherwise."""
265
        stack_on = self.make_branch('stack-on')
266
        parent_bzrdir = self.make_bzrdir('.', format='default')
267
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
268
        source = self.make_branch('source')
269
        target = source.bzrdir.clone('target').open_branch()
4103.2.1 by Andrew Bennetts
Make clone/sprout stacking policy tests a little more precise.
270
        if self.branch_format.supports_stacking():
3641.1.1 by John Arbash Meinel
Merge in 1.6rc5 and revert disabling default stack on policy
271
            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.
272
        else:
273
            self.assertRaises(
274
                errors.UnstackableBranchFormat, target.get_stacked_on_url)
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
275
4103.2.3 by Andrew Bennetts
Other tests for good luck.
276
    def test_sprout_to_smart_server_stacking_policy_handling(self):
277
        """Obey policy where possible, ignore otherwise."""
278
        if isinstance(self.branch_format, branch.BzrBranchFormat4):
279
            raise TestNotApplicable('Branch format 4 is not usable via HPSS.')
280
        stack_on = self.make_branch('stack-on')
281
        parent_bzrdir = self.make_bzrdir('.', format='default')
282
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
283
        source = self.make_branch('source')
284
        url = self.make_smart_server('target').base
285
        target = source.bzrdir.sprout(url).open_branch()
286
        if self.branch_format.supports_stacking():
287
            self.assertEqual('../stack-on', target.get_stacked_on_url())
288
        else:
289
            self.assertRaises(
290
                errors.UnstackableBranchFormat, target.get_stacked_on_url)
291
1551.19.47 by Aaron Bentley
Add test per JAM
292
    def prepare_stacked_on_fetch(self):
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
293
        stack_on = self.make_branch_and_tree('stack-on')
294
        stack_on.commit('first commit', rev_id='rev1')
295
        try:
296
            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'
297
        except unstackable_format_errors, e:
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
298
            raise TestNotApplicable('Format does not support stacking.')
299
        unstacked = self.make_repository('unstacked')
1551.19.47 by Aaron Bentley
Add test per JAM
300
        return stacked_dir.open_workingtree(), unstacked
301
302
    def test_fetch_copies_from_stacked_on(self):
303
        stacked, unstacked = self.prepare_stacked_on_fetch()
304
        unstacked.fetch(stacked.branch.repository, 'rev1')
305
        unstacked.get_revision('rev1')
306
307
    def test_fetch_copies_from_stacked_on_and_stacked(self):
308
        stacked, unstacked = self.prepare_stacked_on_fetch()
309
        stacked.commit('second commit', rev_id='rev2')
310
        unstacked.fetch(stacked.branch.repository, 'rev2')
311
        unstacked.get_revision('rev1')
312
        unstacked.get_revision('rev2')
3830.3.16 by Martin Pool
Add passing tests for iter_lines_added_or_present in stacked repos
313
        self.check_lines_added_or_present(stacked.branch, 'rev1')
314
        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.
315
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
316
    def test_autopack_when_stacked(self):
317
        # in bzr.dev as of 20080730, autopack was reported to fail in stacked
318
        # repositories because of problems with text deltas spanning physical
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
319
        # repository boundaries.  however, i didn't actually get this test to
320
        # fail on that code. -- mbp
3582.1.11 by Martin Pool
doc
321
        # see https://bugs.launchpad.net/bzr/+bug/252821
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
322
        if not self.branch_format.supports_stacking():
323
            raise TestNotApplicable("%r does not support stacking"
324
                % self.branch_format)
325
        stack_on = self.make_branch_and_tree('stack-on')
3582.1.9 by Martin Pool
Make autopack-stacked test use larger files; still does not fail
326
        text_lines = ['line %d blah blah blah\n' % i for i in range(20)]
327
        self.build_tree_contents([('stack-on/a', ''.join(text_lines))])
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
328
        stack_on.add('a')
329
        stack_on.commit('base commit')
330
        stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
331
        stacked_tree = stacked_dir.open_workingtree()
332
        for i in range(20):
3582.1.9 by Martin Pool
Make autopack-stacked test use larger files; still does not fail
333
            text_lines[0] = 'changed in %d\n' % i
334
            self.build_tree_contents([('stacked/a', ''.join(text_lines))])
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
335
            stacked_tree.commit('commit %d' % i)
336
        stacked_tree.branch.repository.pack()
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
337
        stacked_tree.branch.check()
338
339
    def test_pull_delta_when_stacked(self):
340
        if not self.branch_format.supports_stacking():
341
            raise TestNotApplicable("%r does not support stacking"
342
                % self.branch_format)
343
        stack_on = self.make_branch_and_tree('stack-on')
344
        text_lines = ['line %d blah blah blah\n' % i for i in range(20)]
345
        self.build_tree_contents([('stack-on/a', ''.join(text_lines))])
346
        stack_on.add('a')
347
        stack_on.commit('base commit')
348
        # make a stacked branch from the mainline
349
        stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
350
        stacked_tree = stacked_dir.open_workingtree()
351
        # make a second non-stacked branch from the mainline
352
        other_dir = stack_on.bzrdir.sprout('other')
353
        other_tree = other_dir.open_workingtree()
354
        text_lines[9] = 'changed in other\n'
355
        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
356
        stacked_revid = other_tree.commit('commit in other')
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
357
        # this should have generated a delta; try to pull that across
3582.1.15 by Martin Pool
Comments and tests for repository stacking
358
        # bug 252821 caused a RevisionNotPresent here...
359
        stacked_tree.pull(other_tree.branch)
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
360
        stacked_tree.branch.repository.pack()
361
        stacked_tree.branch.check()
3830.3.16 by Martin Pool
Add passing tests for iter_lines_added_or_present in stacked repos
362
        self.check_lines_added_or_present(stacked_tree.branch, stacked_revid)
3582.1.12 by Martin Pool
merge from trunk
363
3582.2.1 by Jonathan Lange
Fix up problems with fetching revisions. Almost entirely abentley's work.
364
    def test_fetch_revisions_with_file_changes(self):
365
        # Fetching revisions including file changes into a stacked branch
366
        # works without error.
367
        # Make the source tree.
368
        src_tree = self.make_branch_and_tree('src')
369
        self.build_tree_contents([('src/a', 'content')])
370
        src_tree.add('a')
371
        src_tree.commit('first commit')
372
373
        # Make the stacked-on branch.
374
        src_tree.bzrdir.sprout('stacked-on')
375
376
        # Make a branch stacked on it.
377
        target = self.make_branch('target')
378
        try:
379
            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'
380
        except unstackable_format_errors, e:
3582.2.1 by Jonathan Lange
Fix up problems with fetching revisions. Almost entirely abentley's work.
381
            raise TestNotApplicable('Format does not support stacking.')
382
383
        # Change the source branch.
384
        self.build_tree_contents([('src/a', 'new content')])
385
        src_tree.commit('second commit', rev_id='rev2')
386
387
        # Fetch changes to the target.
388
        target.fetch(src_tree.branch)
389
        rtree = target.repository.revision_tree('rev2')
390
        rtree.lock_read()
391
        self.addCleanup(rtree.unlock)
392
        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
393
        self.check_lines_added_or_present(target, 'rev2')
3770.2.1 by Michael Hudson
test and feature
394
395
    def test_transform_fallback_location_hook(self):
396
        # The 'transform_fallback_location' branch hook allows us to inspect
397
        # and transform the URL of the fallback location for the branch.
398
        stack_on = self.make_branch('stack-on')
399
        stacked = self.make_branch('stacked')
400
        try:
401
            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'
402
        except unstackable_format_errors, e:
3770.2.1 by Michael Hudson
test and feature
403
            raise TestNotApplicable('Format does not support stacking.')
404
        self.get_transport().rename('stack-on', 'new-stack-on')
405
        hook_calls = []
406
        def hook(stacked_branch, url):
407
            hook_calls.append(url)
408
            return '../new-stack-on'
409
        branch.Branch.hooks.install_named_hook(
410
            'transform_fallback_location', hook, None)
411
        branch.Branch.open('stacked')
412
        self.assertEqual(['../stack-on'], hook_calls)
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
413
414
    def test_stack_on_repository_branch(self):
415
        # Stacking should work when the repo isn't co-located with the
416
        # stack-on branch.
417
        try:
418
            repo = self.make_repository('repo', shared=True)
419
        except errors.IncompatibleFormat:
420
            raise TestNotApplicable()
421
        # Avoid make_branch, which produces standalone branches.
422
        bzrdir = self.make_bzrdir('repo/stack-on')
3834.5.4 by John Arbash Meinel
Skip the stack_on_repository test for BranchReference branches.
423
        try:
424
            b = bzrdir.create_branch()
425
        except errors.UninitializableFormat:
426
            raise TestNotApplicable()
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
427
        transport = self.get_transport('stacked')
428
        b.bzrdir.clone_on_transport(transport, stacked_on=b.base)
3830.2.2 by Aaron Bentley
Add explanatory comment.
429
        # Ensure that opening the branch doesn't raise.
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
430
        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.
431
432
433
class TestStackingConnections(
434
    transport_util.TestCaseWithConnectionHookedTransport):
435
436
    def setUp(self):
437
        super(TestStackingConnections, self).setUp()
438
        try:
439
            base_tree = self.make_branch_and_tree('base',
440
                                                  format=self.bzrdir_format)
441
        except errors.UninitializableFormat, e:
442
            raise TestNotApplicable(e)
443
        stacked = self.make_branch('stacked', format=self.bzrdir_format)
444
        try:
445
            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'
446
        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.
447
            raise TestNotApplicable(e)
448
        base_tree.commit('first', rev_id='rev-base')
449
        stacked.set_last_revision_info(1, 'rev-base')
450
        stacked_relative = self.make_branch('stacked_relative',
451
                                            format=self.bzrdir_format)
452
        stacked_relative.set_stacked_on_url('../base')
453
        stacked.set_last_revision_info(1, 'rev-base')
454
        self.start_logging_connections()
455
456
    def test_open_stacked(self):
457
        b = branch.Branch.open(self.get_url('stacked'))
458
        rev = b.repository.get_revision('rev-base')
459
        self.assertEqual(1, len(self.connections))
460
461
    def test_open_stacked_relative(self):
462
        b = branch.Branch.open(self.get_url('stacked_relative'))
463
        rev = b.repository.get_revision('rev-base')
464
        self.assertEqual(1, len(self.connections))