/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
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
26
from bzrlib.tests import TestNotApplicable, KnownFailure
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
31
class TestStacking(TestCaseWithBranch):
32
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
33
    def test_get_set_stacked_on_url(self):
3221.11.3 by Robert Collins
Add missing test script.
34
        # branches must either:
35
        # raise UnstackableBranchFormat or
36
        # raise UnstackableRepositoryFormat or
37
        # permit stacking to be done and then return the stacked location.
38
        branch = self.make_branch('branch')
39
        target = self.make_branch('target')
40
        old_format_errors = (
41
            errors.UnstackableBranchFormat,
42
            errors.UnstackableRepositoryFormat,
43
            )
44
        try:
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
45
            branch.set_stacked_on_url(target.base)
3221.11.3 by Robert Collins
Add missing test script.
46
        except old_format_errors:
47
            # if the set failed, so must the get
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
48
            self.assertRaises(old_format_errors, branch.get_stacked_on_url)
3221.11.3 by Robert Collins
Add missing test script.
49
            return
50
        # now we have a stacked branch:
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
51
        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
52
        branch.set_stacked_on_url(None)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
53
        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.
54
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
55
    def test_get_set_stacked_on_relative(self):
56
        # Branches can be stacked on other branches using relative paths.
57
        branch = self.make_branch('branch')
58
        target = self.make_branch('target')
59
        old_format_errors = (
60
            errors.UnstackableBranchFormat,
61
            errors.UnstackableRepositoryFormat,
62
            )
63
        try:
3537.3.5 by Martin Pool
merge trunk including stacking policy
64
            branch.set_stacked_on_url('../target')
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
65
        except old_format_errors:
66
            # if the set failed, so must the get
3537.3.5 by Martin Pool
merge trunk including stacking policy
67
            self.assertRaises(old_format_errors, branch.get_stacked_on_url)
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
68
            return
3537.3.5 by Martin Pool
merge trunk including stacking policy
69
        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.
70
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
71
    def assertRevisionInRepository(self, repo_path, revid):
72
        """Check that a revision is in a repository, disregarding stacking."""
73
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
74
        self.assertTrue(repo.has_revision(revid))
75
76
    def assertRevisionNotInRepository(self, repo_path, revid):
77
        """Check that a revision is not in a repository, disregarding stacking."""
78
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
79
        self.assertFalse(repo.has_revision(revid))
80
81
    def test_get_graph_stacked(self):
82
        """A stacked repository shows the graph of its parent."""
83
        trunk_tree = self.make_branch_and_tree('mainline')
84
        trunk_revid = trunk_tree.commit('mainline')
85
        # make a new branch, and stack on the existing one.  we don't use
86
        # sprout(stacked=True) here because if that is buggy and copies data
87
        # it would cause a false pass of this test.
88
        new_branch = self.make_branch('new_branch')
89
        try:
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
90
            new_branch.set_stacked_on_url(trunk_tree.branch.base)
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
91
        except (errors.UnstackableBranchFormat,
92
            errors.UnstackableRepositoryFormat), e:
93
            raise TestNotApplicable(e)
94
        # reading the graph from the stacked branch's repository should see
95
        # data from the stacked-on branch
96
        new_repo = new_branch.repository
97
        new_repo.lock_read()
98
        try:
99
            self.assertEqual(new_repo.get_parent_map([trunk_revid]),
100
                {trunk_revid: (NULL_REVISION, )})
101
        finally:
102
            new_repo.unlock()
103
104
    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.
105
        # We have a mainline
106
        trunk_tree = self.make_branch_and_tree('mainline')
107
        trunk_revid = trunk_tree.commit('mainline')
3221.18.4 by Ian Clatworthy
shallow -> stacked
108
        # 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.
109
        try:
3221.18.4 by Ian Clatworthy
shallow -> stacked
110
            new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
111
        except (errors.UnstackableBranchFormat,
3517.4.12 by Martin Pool
Clearer per-branch-format tests for stacking
112
            errors.UnstackableRepositoryFormat), e:
113
            raise TestNotApplicable(e)
114
        # stacked repository
115
        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.
116
        new_tree = new_dir.open_workingtree()
3537.3.4 by Martin Pool
Improved branch stacking tests
117
        new_branch_revid = new_tree.commit('something local')
118
        self.assertRevisionNotInRepository('mainline', new_branch_revid)
119
        self.assertRevisionInRepository('newbranch', new_branch_revid)
120
3793.1.2 by Andrew Bennetts
Add test showing that stacking from the smart server works.
121
    # XXX: this helper probably belongs on TestCaseWithTransport
122
    def make_smart_server(self, path):
123
        smart_server = server.SmartTCPServer_for_testing()
124
        smart_server.setUp(self.get_server())
125
        remote_transport = get_transport(smart_server.get_url()).clone(path)
126
        self.addCleanup(smart_server.tearDown)
127
        return remote_transport
128
129
    def test_sprout_stacked_from_smart_server(self):
130
        if isinstance(self.branch_format, branch.BzrBranchFormat4):
131
            raise TestNotApplicable('Branch format 4 is not usable via HPSS.')
132
        # We have a mainline
133
        trunk_tree = self.make_branch_and_tree('mainline')
134
        trunk_revid = trunk_tree.commit('mainline')
135
        # Make sure that we can make a stacked branch from it
136
        try:
137
            trunk_tree.bzrdir.sprout('testbranch', stacked=True)
138
        except (errors.UnstackableBranchFormat,
139
            errors.UnstackableRepositoryFormat), e:
140
            raise TestNotApplicable(e)
141
        # Now serve the original mainline from a smart server
142
        remote_transport = self.make_smart_server('mainline')
143
        remote_bzrdir = bzrdir.BzrDir.open_from_transport(remote_transport)
144
        # and make branch from the smart server which is stacked
145
        new_dir = remote_bzrdir.sprout('newbranch', stacked=True)
146
        # stacked repository
147
        self.assertRevisionNotInRepository('newbranch', trunk_revid)
148
        new_tree = new_dir.open_workingtree()
149
        new_branch_revid = new_tree.commit('something local')
150
        self.assertRevisionNotInRepository('mainline', new_branch_revid)
151
        self.assertRevisionInRepository('newbranch', new_branch_revid)
152
3537.3.4 by Martin Pool
Improved branch stacking tests
153
    def test_unstack_fetches(self):
154
        """Removing the stacked-on branch pulls across all data"""
155
        # We have a mainline
156
        trunk_tree = self.make_branch_and_tree('mainline')
157
        trunk_revid = trunk_tree.commit('revision on mainline')
158
        # and make branch from it which is stacked
159
        try:
160
            new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
161
        except (errors.UnstackableBranchFormat,
162
            errors.UnstackableRepositoryFormat), e:
163
            raise TestNotApplicable(e)
164
        # stacked repository
165
        self.assertRevisionNotInRepository('newbranch', trunk_revid)
166
        # now when we unstack that should implicitly fetch, to make sure that
167
        # the branch will still work
168
        new_branch = new_dir.open_branch()
169
        new_branch.set_stacked_on_url(None)
170
        self.assertRevisionInRepository('newbranch', trunk_revid)
171
        # of course it's still in the mainline
172
        self.assertRevisionInRepository('mainline', trunk_revid)
173
        # and now we're no longer stacked
3537.3.5 by Martin Pool
merge trunk including stacking policy
174
        self.assertRaises(errors.NotStacked,
175
            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.
176
3567.3.4 by Michael Hudson
make test a lot better
177
    def make_stacked_bzrdir(self, in_directory=None):
3567.3.7 by Michael Hudson
better docstring
178
        """Create a stacked branch and return its bzrdir.
3567.3.4 by Michael Hudson
make test a lot better
179
180
        :param in_directory: If not None, create a directory of this
181
            name and create the stacking and stacked-on bzrdirs in
182
            this directory.
183
        """
184
        if in_directory is not None:
185
            self.get_transport().mkdir(in_directory)
186
            prefix = in_directory + '/'
187
        else:
188
            prefix = ''
189
        tree = self.make_branch_and_tree(prefix + 'stacked-on')
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
190
        tree.commit('Added foo')
191
        stacked_bzrdir = tree.branch.bzrdir.sprout(
3567.3.4 by Michael Hudson
make test a lot better
192
            prefix + 'stacked', tree.branch.last_revision(), stacked=True)
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
193
        return stacked_bzrdir
194
195
    def test_clone_from_stacked_branch_preserve_stacking(self):
3242.3.24 by Aaron Bentley
Fix test failures
196
        # We can clone from the bzrdir of a stacked branch. If
197
        # preserve_stacking is True, the cloned branch is stacked on the
198
        # same branch as the original.
3242.3.21 by Jonathan Lange
Preserve stacking in clone
199
        try:
3567.3.4 by Michael Hudson
make test a lot better
200
            stacked_bzrdir = self.make_stacked_bzrdir()
3242.3.21 by Jonathan Lange
Preserve stacking in clone
201
        except (errors.UnstackableBranchFormat,
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
202
                errors.UnstackableRepositoryFormat), e:
3242.3.21 by Jonathan Lange
Preserve stacking in clone
203
            # not a testable combination.
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
204
            raise TestNotApplicable(e)
3242.3.24 by Aaron Bentley
Fix test failures
205
        cloned_bzrdir = stacked_bzrdir.clone('cloned', preserve_stacking=True)
3242.3.21 by Jonathan Lange
Preserve stacking in clone
206
        try:
207
            self.assertEqual(
3537.3.5 by Martin Pool
merge trunk including stacking policy
208
                stacked_bzrdir.open_branch().get_stacked_on_url(),
209
                cloned_bzrdir.open_branch().get_stacked_on_url())
3242.3.21 by Jonathan Lange
Preserve stacking in clone
210
        except (errors.UnstackableBranchFormat,
211
                errors.UnstackableRepositoryFormat):
212
            pass
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
213
3567.3.4 by Michael Hudson
make test a lot better
214
    def test_clone_from_branch_stacked_on_relative_url_preserve_stacking(self):
215
        # If a branch's stacked-on url is relative, we can still clone
216
        # from it with preserve_stacking True and get a branch stacked
217
        # on an appropriately adjusted relative url.
3567.3.3 by Michael Hudson
very hackish test
218
        try:
3567.3.4 by Michael Hudson
make test a lot better
219
            stacked_bzrdir = self.make_stacked_bzrdir(in_directory='dir')
3567.3.3 by Michael Hudson
very hackish test
220
        except (errors.UnstackableBranchFormat,
3567.3.6 by Michael Hudson
oops
221
                errors.UnstackableRepositoryFormat), e:
3567.3.3 by Michael Hudson
very hackish test
222
            # not a testable combination.
3567.3.5 by Michael Hudson
use TestNotApplicable in all the stacking clone() tests.
223
            raise TestNotApplicable(e)
3567.3.4 by Michael Hudson
make test a lot better
224
        stacked_bzrdir.open_branch().set_stacked_on_url('../stacked-on')
3567.3.3 by Michael Hudson
very hackish test
225
        cloned_bzrdir = stacked_bzrdir.clone('cloned', preserve_stacking=True)
3567.3.4 by Michael Hudson
make test a lot better
226
        self.assertEqual(
227
            '../dir/stacked-on',
228
            cloned_bzrdir.open_branch().get_stacked_on_url())
3567.3.3 by Michael Hudson
very hackish test
229
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
230
    def test_clone_from_stacked_branch_no_preserve_stacking(self):
231
        try:
3567.3.4 by Michael Hudson
make test a lot better
232
            stacked_bzrdir = self.make_stacked_bzrdir()
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
233
        except (errors.UnstackableBranchFormat,
3567.3.6 by Michael Hudson
oops
234
                errors.UnstackableRepositoryFormat), 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()
3641.1.1 by John Arbash Meinel
Merge in 1.6rc5 and revert disabling default stack on policy
257
        try:
258
            self.assertEqual('../stack-on', target.get_stacked_on_url())
259
        except errors.UnstackableBranchFormat:
260
            pass
3242.3.38 by Aaron Bentley
Enhance tests
261
262
    def test_clone_stacking_policy_handling(self):
263
        """Obey policy where possible, ignore otherwise."""
264
        stack_on = self.make_branch('stack-on')
265
        parent_bzrdir = self.make_bzrdir('.', format='default')
266
        parent_bzrdir.get_config().set_default_stack_on('stack-on')
267
        source = self.make_branch('source')
268
        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
269
        try:
270
            self.assertEqual('../stack-on', target.get_stacked_on_url())
271
        except errors.UnstackableBranchFormat:
272
            pass
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
273
1551.19.47 by Aaron Bentley
Add test per JAM
274
    def prepare_stacked_on_fetch(self):
1551.19.46 by Aaron Bentley
Fix fetch from stacked respositories (#248506)
275
        stack_on = self.make_branch_and_tree('stack-on')
276
        stack_on.commit('first commit', rev_id='rev1')
277
        try:
278
            stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
279
        except (errors.UnstackableRepositoryFormat,
280
                errors.UnstackableBranchFormat):
281
            raise TestNotApplicable('Format does not support stacking.')
282
        unstacked = self.make_repository('unstacked')
1551.19.47 by Aaron Bentley
Add test per JAM
283
        return stacked_dir.open_workingtree(), unstacked
284
285
    def test_fetch_copies_from_stacked_on(self):
286
        stacked, unstacked = self.prepare_stacked_on_fetch()
287
        unstacked.fetch(stacked.branch.repository, 'rev1')
288
        unstacked.get_revision('rev1')
289
290
    def test_fetch_copies_from_stacked_on_and_stacked(self):
291
        stacked, unstacked = self.prepare_stacked_on_fetch()
292
        stacked.commit('second commit', rev_id='rev2')
293
        unstacked.fetch(stacked.branch.repository, 'rev2')
294
        unstacked.get_revision('rev1')
295
        unstacked.get_revision('rev2')
3582.2.1 by Jonathan Lange
Fix up problems with fetching revisions. Almost entirely abentley's work.
296
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
297
    def test_autopack_when_stacked(self):
298
        # in bzr.dev as of 20080730, autopack was reported to fail in stacked
299
        # repositories because of problems with text deltas spanning physical
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
300
        # repository boundaries.  however, i didn't actually get this test to
301
        # fail on that code. -- mbp
3582.1.11 by Martin Pool
doc
302
        # see https://bugs.launchpad.net/bzr/+bug/252821
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
303
        if not self.branch_format.supports_stacking():
304
            raise TestNotApplicable("%r does not support stacking"
305
                % self.branch_format)
306
        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
307
        text_lines = ['line %d blah blah blah\n' % i for i in range(20)]
308
        self.build_tree_contents([('stack-on/a', ''.join(text_lines))])
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
309
        stack_on.add('a')
310
        stack_on.commit('base commit')
311
        stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
312
        stacked_tree = stacked_dir.open_workingtree()
313
        for i in range(20):
3582.1.9 by Martin Pool
Make autopack-stacked test use larger files; still does not fail
314
            text_lines[0] = 'changed in %d\n' % i
315
            self.build_tree_contents([('stacked/a', ''.join(text_lines))])
3582.1.8 by Martin Pool
Add test for repeated commits into packed repository
316
            stacked_tree.commit('commit %d' % i)
317
        stacked_tree.branch.repository.pack()
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
318
        stacked_tree.branch.check()
319
320
    def test_pull_delta_when_stacked(self):
321
        if not self.branch_format.supports_stacking():
322
            raise TestNotApplicable("%r does not support stacking"
323
                % self.branch_format)
324
        stack_on = self.make_branch_and_tree('stack-on')
325
        text_lines = ['line %d blah blah blah\n' % i for i in range(20)]
326
        self.build_tree_contents([('stack-on/a', ''.join(text_lines))])
327
        stack_on.add('a')
328
        stack_on.commit('base commit')
329
        # make a stacked branch from the mainline
330
        stacked_dir = stack_on.bzrdir.sprout('stacked', stacked=True)
331
        stacked_tree = stacked_dir.open_workingtree()
332
        # make a second non-stacked branch from the mainline
333
        other_dir = stack_on.bzrdir.sprout('other')
334
        other_tree = other_dir.open_workingtree()
335
        text_lines[9] = 'changed in other\n'
336
        self.build_tree_contents([('other/a', ''.join(text_lines))])
337
        other_tree.commit('commit in other')
338
        # this should have generated a delta; try to pull that across
3582.1.15 by Martin Pool
Comments and tests for repository stacking
339
        # bug 252821 caused a RevisionNotPresent here...
340
        stacked_tree.pull(other_tree.branch)
3582.1.10 by Martin Pool
Add failing tets for pull into stacked repository
341
        stacked_tree.branch.repository.pack()
342
        stacked_tree.branch.check()
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')
360
        except (errors.UnstackableRepositoryFormat,
361
                errors.UnstackableBranchFormat):
362
            raise TestNotApplicable('Format does not support stacking.')
363
364
        # Change the source branch.
365
        self.build_tree_contents([('src/a', 'new content')])
366
        src_tree.commit('second commit', rev_id='rev2')
367
368
        # Fetch changes to the target.
369
        target.fetch(src_tree.branch)
370
        rtree = target.repository.revision_tree('rev2')
371
        rtree.lock_read()
372
        self.addCleanup(rtree.unlock)
373
        self.assertEqual('new content', rtree.get_file_by_path('a').read())
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')
382
        except (errors.UnstackableRepositoryFormat,
383
                errors.UnstackableBranchFormat):
384
            raise TestNotApplicable('Format does not support stacking.')
385
        self.get_transport().rename('stack-on', 'new-stack-on')
386
        hook_calls = []
387
        def hook(stacked_branch, url):
388
            hook_calls.append(url)
389
            return '../new-stack-on'
390
        branch.Branch.hooks.install_named_hook(
391
            'transform_fallback_location', hook, None)
392
        branch.Branch.open('stacked')
393
        self.assertEqual(['../stack-on'], hook_calls)