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