/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2009, 2010 Canonical Ltd
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
17
"""Tests for branch.push behaviour."""
18
5317.1.1 by Robert Collins
Make the interbranch test_no_get_parent_map_after_insert_stream test work for looms - a little ugly, will want a generic hook-out to foreign formats in some form, at some point.
19
from testtools.matchers import (
20
    Equals,
21
    MatchesAny,
22
    )
23
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
24
from ... import (
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
25
    branch,
4332.3.35 by Robert Collins
Fix failing tests.
26
    check,
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
27
    controldir,
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
28
    errors,
29
    push,
30
    tests,
6670.4.1 by Jelmer Vernooij
Update imports.
31
    )
32
from ...bzr import (
33
    branch as bzrbranch,
5863.4.2 by Jelmer Vernooij
Fix test.
34
    vf_repository,
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
35
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
36
from ...branch import Branch
37
from ...controldir import ControlDir
38
from ...memorytree import MemoryTree
39
from ...revision import NULL_REVISION
40
from ...sixish import (
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
41
    BytesIO,
42
    )
6670.4.16 by Jelmer Vernooij
Move smart to breezy.bzr.
43
from ...bzr.smart.repository import SmartServerRepositoryGetParentMap
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
44
from . import (
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
45
    TestCaseWithInterBranch,
46
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
47
from .. import test_server
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
48
49
4211.1.6 by Jelmer Vernooij
Review from Ian.
50
# These tests are based on similar tests in 
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
51
# breezy.tests.per_branch.test_push.
4211.1.6 by Jelmer Vernooij
Review from Ian.
52
53
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
54
class TestPush(TestCaseWithInterBranch):
55
56
    def test_push_convergence_simple(self):
57
        # when revisions are pushed, the left-most accessible parents must
58
        # become the revision-history.
59
        mine = self.make_from_branch_and_tree('mine')
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
60
        mine.commit('1st post', allow_pointless=True)
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
61
        try:
62
            other = self.sprout_to(mine.controldir, 'other').open_workingtree()
63
        except errors.NoRoundtrippingSupport:
64
            raise tests.TestNotApplicable(
65
                'lossless push between %r and %r not supported' %
66
                (self.branch_format_from, self.branch_format_to))
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
67
        m1 = other.commit('my change', allow_pointless=True)
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
68
        try:
69
            mine.merge_from_branch(other.branch)
70
        except errors.NoRoundtrippingSupport:
71
            raise tests.TestNotApplicable(
72
                'lossless push between %r and %r not supported' %
73
                (self.branch_format_from, self.branch_format_to))
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
74
        p2 = mine.commit('merge my change')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
75
        result = mine.branch.push(other.branch)
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
76
        self.assertEqual(p2, other.branch.last_revision())
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
77
        # result object contains some structured data
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
78
        self.assertEqual(result.old_revid, m1)
79
        self.assertEqual(result.new_revid, p2)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
80
81
    def test_push_merged_indirect(self):
82
        # it should be possible to do a push from one branch into another
83
        # when the tip of the target was merged into the source branch
84
        # via a third branch - so its buried in the ancestry and is not
85
        # directly accessible.
86
        mine = self.make_from_branch_and_tree('mine')
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
87
        p1 = mine.commit('1st post', allow_pointless=True)
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
88
        try:
89
            target = self.sprout_to(mine.controldir, 'target').open_workingtree()
90
        except errors.NoRoundtrippingSupport:
91
            raise tests.TestNotApplicable(
92
                'lossless push between %r and %r not supported' %
93
                (self.branch_format_from, self.branch_format_to))
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
94
        m1 = target.commit('my change', allow_pointless=True)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
95
        other = self.sprout_to(mine.controldir, 'other').open_workingtree()
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
96
        other.merge_from_branch(target.branch)
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
97
        o2 = other.commit('merge my change')
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
98
        try:
99
            mine.merge_from_branch(other.branch)
100
        except errors.NoRoundtrippingSupport:
101
            raise tests.TestNotApplicable(
102
                'lossless push between %r and %r not supported' %
103
                (self.branch_format_from, self.branch_format_to))
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
104
        p2 = mine.commit('merge other')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
105
        mine.branch.push(target.branch)
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
106
        self.assertEqual(p2, target.branch.last_revision())
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
107
108
    def test_push_to_checkout_updates_master(self):
109
        """Pushing into a checkout updates the checkout and the master branch"""
110
        master_tree = self.make_to_branch_and_tree('master')
111
        checkout = self.make_to_branch_and_tree('checkout')
112
        try:
113
            checkout.branch.bind(master_tree.branch)
114
        except errors.UpgradeRequired:
115
            # cant bind this format, the test is irrelevant.
116
            return
117
        rev1 = checkout.commit('master')
118
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
119
        try:
120
            other_bzrdir = self.sprout_from(master_tree.branch.controldir, 'other')
121
        except errors.NoRoundtrippingSupport:
122
            raise tests.TestNotApplicable(
123
                'lossless push between %r and %r not supported' %
124
                (self.branch_format_from, self.branch_format_to))
4211.1.5 by Jelmer Vernooij
Fix copyright year, number of columns used.
125
        other = other_bzrdir.open_workingtree()
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
126
        rev2 = other.commit('other commit')
127
        # now push, which should update both checkout and master.
128
        other.branch.push(checkout.branch)
6165.4.6 by Jelmer Vernooij
Avoid more uses of revision_history.
129
        self.assertEqual(rev2, checkout.branch.last_revision())
130
        self.assertEqual(rev2, master_tree.branch.last_revision())
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
131
132
    def test_push_raises_specific_error_on_master_connection_error(self):
133
        master_tree = self.make_to_branch_and_tree('master')
134
        checkout = self.make_to_branch_and_tree('checkout')
135
        try:
136
            checkout.branch.bind(master_tree.branch)
137
        except errors.UpgradeRequired:
138
            # cant bind this format, the test is irrelevant.
139
            return
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
140
        other_bzrdir = self.sprout_from(master_tree.branch.controldir, 'other')
4211.1.5 by Jelmer Vernooij
Fix copyright year, number of columns used.
141
        other = other_bzrdir.open_workingtree()
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
142
        # move the branch out of the way on disk to cause a connection
143
        # error.
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
144
        master_tree.controldir.destroy_branch()
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
145
        # try to push, which should raise a BoundBranchConnectionFailure.
146
        self.assertRaises(errors.BoundBranchConnectionFailure,
147
                other.branch.push, checkout.branch)
148
149
    def test_push_uses_read_lock(self):
150
        """Push should only need a read lock on the source side."""
151
        source = self.make_from_branch_and_tree('source')
152
        target = self.make_to_branch('target')
153
154
        self.build_tree(['source/a'])
155
        source.add(['a'])
156
        source.commit('a')
157
158
        try:
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
159
            with source.branch.lock_read(), target.lock_write():
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
160
                source.branch.push(target, stop_revision=source.last_revision())
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
161
        except errors.NoRoundtrippingSupport:
162
            raise tests.TestNotApplicable(
163
                'lossless push between %r and %r not supported' %
164
                (self.branch_format_from, self.branch_format_to))
165
166
    def test_push_uses_read_lock_lossy(self):
167
        """Push should only need a read lock on the source side."""
168
        source = self.make_from_branch_and_tree('source')
169
        target = self.make_to_branch('target')
170
171
        self.build_tree(['source/a'])
172
        source.add(['a'])
173
        source.commit('a')
174
175
        try:
176
            with source.branch.lock_read(), target.lock_write():
177
                source.branch.push(target, stop_revision=source.last_revision(), lossy=True)
178
        except errors.LossyPushToSameVCS:
179
            raise tests.TestNotApplicable(
180
                'push between branches of same format')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
181
182
    def test_push_within_repository(self):
183
        """Push from one branch to another inside the same repository."""
184
        try:
185
            repo = self.make_repository('repo', shared=True)
186
        except (errors.IncompatibleFormat, errors.UninitializableFormat):
187
            # This Branch format cannot create shared repositories
188
            return
5297.2.2 by Robert Collins
Fixup tests in per_interbranch not being strict about making the from format the configured one.
189
        # This is a little bit trickier because make_from_branch_and_tree will not
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
190
        # re-use a shared repository.
191
        try:
192
            a_branch = self.make_from_branch('repo/tree')
193
        except (errors.UninitializableFormat):
194
            # Cannot create these branches
195
            return
196
        try:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
197
            tree = a_branch.controldir.create_workingtree()
6127.1.9 by Jelmer Vernooij
Add lightweight option to _get_checkout_format().
198
        except errors.UnsupportedOperation:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
199
            self.assertFalse(a_branch.controldir._format.supports_workingtrees)
6127.1.9 by Jelmer Vernooij
Add lightweight option to _get_checkout_format().
200
            tree = a_branch.create_checkout('repo/tree', lightweight=True)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
201
        except errors.NotLocalUrl:
5017.3.41 by Vincent Ladeuil
-s bt.per_interbranch passing
202
            if self.vfs_transport_factory is test_server.LocalURLServer:
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
203
                # the branch is colocated on disk, we cannot create a checkout.
204
                # hopefully callers will expect this.
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
205
                local_controldir = controldir.ControlDir.open(self.get_vfs_only_url('repo/tree'))
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
206
                tree = local_controldir.create_workingtree()
207
            else:
208
                tree = a_branch.create_checkout('repo/tree', lightweight=True)
209
        self.build_tree(['repo/tree/a'])
210
        tree.add(['a'])
211
        tree.commit('a')
212
213
        to_branch = self.make_to_branch('repo/branch')
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
214
        try:
215
            tree.branch.push(to_branch)
216
        except errors.NoRoundtrippingSupport:
217
            tree.branch.push(to_branch, lossy=True)
218
        else:
219
            self.assertEqual(tree.branch.last_revision(),
220
                             to_branch.last_revision())
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
221
222
    def test_push_overwrite_of_non_tip_with_stop_revision(self):
223
        """Combining the stop_revision and overwrite options works.
224
225
        This was <https://bugs.launchpad.net/bzr/+bug/234229>.
226
        """
227
        source = self.make_from_branch_and_tree('source')
228
        target = self.make_to_branch('target')
229
230
        source.commit('1st commit')
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
231
        try:
232
            source.branch.push(target)
233
        except errors.NoRoundtrippingSupport:
234
            raise tests.TestNotApplicable(
235
                'lossless push between %r and %r not supported' %
236
                (self.branch_format_from, self.branch_format_to))
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
237
        rev2 = source.commit('2nd commit')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
238
        source.commit('3rd commit')
239
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
240
        source.branch.push(target, stop_revision=rev2, overwrite=True)
241
        self.assertEqual(rev2, target.last_revision())
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
242
243
    def test_push_with_default_stacking_does_not_create_broken_branch(self):
244
        """Pushing a new standalone branch works even when there's a default
245
        stacking policy at the destination.
246
247
        The new branch will preserve the repo format (even if it isn't the
248
        default for the branch), and will be stacked when the repo format
249
        allows (which means that the branch format isn't necessarly preserved).
250
        """
6653.1.1 by Jelmer Vernooij
Split bzr branch code out into breezy.bzrbranch.
251
        if isinstance(self.branch_format_from, bzrbranch.BranchReferenceFormat):
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
252
            # This test could in principle apply to BranchReferenceFormat, but
253
            # make_branch_builder doesn't support it.
254
            raise tests.TestSkipped(
255
                "BranchBuilder can't make reference branches.")
256
        # Make a branch called "local" in a stackable repository
257
        # The branch has 3 revisions:
258
        #   - rev-1, adds a file
259
        #   - rev-2, no changes
260
        #   - rev-3, modifies the file.
261
        repo = self.make_repository('repo', shared=True, format='1.6')
6862.2.2 by Jelmer Vernooij
Skip another test if format can't be initialized.
262
        try:
263
            builder = self.make_from_branch_builder('repo/local')
264
        except errors.UninitializableFormat:
265
            raise tests.TestNotApplicable(
266
                'BranchBuilder can not initialize some formats')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
267
        builder.start_series()
6821.2.2 by Jelmer Vernooij
More foreign fixes.
268
        revid1 = builder.build_snapshot(None, [
6883.22.13 by Jelmer Vernooij
Actually pass in None file-ids to BranchBuilder.
269
            ('add', ('', None, 'directory', '')),
270
            ('add', ('filename', None, 'file', 'content\n'))])
6821.2.2 by Jelmer Vernooij
More foreign fixes.
271
        revid2 = builder.build_snapshot([revid1], [])
272
        revid3 = builder.build_snapshot([revid2],
6883.22.1 by Jelmer Vernooij
Take paths in BranchBuilder.
273
            [('modify', ('filename', 'new-content\n'))])
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
274
        builder.finish_series()
275
        trunk = builder.get_branch()
276
        # Sprout rev-1 to "trunk", so that we can stack on it.
6821.2.2 by Jelmer Vernooij
More foreign fixes.
277
        trunk.controldir.sprout(self.get_url('trunk'), revision_id=revid1)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
278
        # Set a default stacking policy so that new branches will automatically
279
        # stack on trunk.
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
280
        self.make_controldir('.').get_config().set_default_stack_on('trunk')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
281
        # Push rev-2 to a new branch "remote".  It will be stacked on "trunk".
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
282
        output = BytesIO()
6821.2.2 by Jelmer Vernooij
More foreign fixes.
283
        push._show_push_branch(trunk, revid2, self.get_url('remote'), output)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
284
        # Push rev-3 onto "remote".  If "remote" not stacked and is missing the
285
        # fulltext record for f-id @ rev-1, then this will fail.
286
        remote_branch = Branch.open(self.get_url('remote'))
287
        trunk.push(remote_branch)
4332.3.35 by Robert Collins
Fix failing tests.
288
        check.check_dwim(remote_branch.base, False, True, True)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
289
290
    def test_no_get_parent_map_after_insert_stream(self):
291
        # Effort test for bug 331823
292
        self.setup_smart_server_with_call_log()
293
        # Make a local branch with four revisions.  Four revisions because:
294
        # one to push, one there for _walk_to_common_revisions to find, one we
295
        # don't want to access, one for luck :)
6653.1.1 by Jelmer Vernooij
Split bzr branch code out into breezy.bzrbranch.
296
        if isinstance(self.branch_format_from, bzrbranch.BranchReferenceFormat):
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
297
            # This test could in principle apply to BranchReferenceFormat, but
298
            # make_branch_builder doesn't support it.
299
            raise tests.TestSkipped(
300
                "BranchBuilder can't make reference branches.")
301
        try:
302
            builder = self.make_from_branch_builder('local')
303
        except (errors.TransportNotPossible, errors.UninitializableFormat):
304
            raise tests.TestNotApplicable('format not directly constructable')
305
        builder.start_series()
6821.2.2 by Jelmer Vernooij
More foreign fixes.
306
        first = builder.build_snapshot(None, [
6883.22.13 by Jelmer Vernooij
Actually pass in None file-ids to BranchBuilder.
307
            ('add', ('', None, 'directory', ''))])
6821.2.2 by Jelmer Vernooij
More foreign fixes.
308
        second = builder.build_snapshot([first], [])
309
        third = builder.build_snapshot([second], [])
310
        fourth = builder.build_snapshot([third], [])
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
311
        builder.finish_series()
312
        local = branch.Branch.open(self.get_vfs_only_url('local'))
313
        # Initial push of three revisions
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
314
        remote_bzrdir = local.controldir.sprout(
6821.2.2 by Jelmer Vernooij
More foreign fixes.
315
            self.get_url('remote'), revision_id=third)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
316
        remote = remote_bzrdir.open_branch()
6876.7.1 by Jelmer Vernooij
Only check for certain HPSS behaviour for vf repositories.
317
        if not remote.repository._format.supports_full_versioned_files:
318
            raise tests.TestNotApplicable(
319
                'remote is not a VersionedFile repository')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
320
        # Push fourth revision
321
        self.reset_smart_call_log()
322
        self.disableOptimisticGetParentMap()
323
        self.assertFalse(local.is_locked())
324
        local.push(remote)
325
        hpss_call_names = [item.call.method for item in self.hpss_calls]
6861.5.2 by Jelmer Vernooij
Fix some more foreign branch tests.
326
        self.assertIn('Repository.insert_stream_1.19', hpss_call_names)
4476.3.18 by Andrew Bennetts
Update some tests that were expecting the pre-1.17 insert_stream verb.
327
        insert_stream_idx = hpss_call_names.index(
4476.3.82 by Andrew Bennetts
Mention another bug fix in NEWS, and update verb name, comments, and NEWS additions for landing on 1.19 rather than 1.18.
328
            'Repository.insert_stream_1.19')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
329
        calls_after_insert_stream = hpss_call_names[insert_stream_idx:]
330
        # After inserting the stream the client has no reason to query the
331
        # remote graph any further.
5317.1.1 by Robert Collins
Make the interbranch test_no_get_parent_map_after_insert_stream test work for looms - a little ugly, will want a generic hook-out to foreign formats in some form, at some point.
332
        bzr_core_trace = Equals(
333
            ['Repository.insert_stream_1.19', 'Repository.insert_stream_1.19',
6282.6.33 by Jelmer Vernooij
Fix some tests.
334
             'Branch.set_last_revision_info', 'Branch.unlock'])
5317.1.1 by Robert Collins
Make the interbranch test_no_get_parent_map_after_insert_stream test work for looms - a little ugly, will want a generic hook-out to foreign formats in some form, at some point.
335
        bzr_loom_trace = Equals(
336
            ['Repository.insert_stream_1.19', 'Repository.insert_stream_1.19',
6282.6.33 by Jelmer Vernooij
Fix some tests.
337
             'Branch.set_last_revision_info', 'get', 'Branch.unlock'])
5317.1.1 by Robert Collins
Make the interbranch test_no_get_parent_map_after_insert_stream test work for looms - a little ugly, will want a generic hook-out to foreign formats in some form, at some point.
338
        self.assertThat(calls_after_insert_stream,
339
            MatchesAny(bzr_core_trace, bzr_loom_trace))
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
340
341
    def disableOptimisticGetParentMap(self):
342
        # Tweak some class variables to stop remote get_parent_map calls asking
343
        # for or receiving more data than the caller asked for.
5863.4.2 by Jelmer Vernooij
Fix test.
344
        self.overrideAttr(vf_repository.InterVersionedFileRepository,
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
345
                          '_walk_to_common_revisions_batch_size', 1)
346
        self.overrideAttr(SmartServerRepositoryGetParentMap,
347
                            'no_extra_results', True)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
348
349
350
class TestPushHook(TestCaseWithInterBranch):
351
352
    def setUp(self):
353
        self.hook_calls = []
6552.1.4 by Vincent Ladeuil
Remaining tests matching setup(self) that can be rewritten with super().
354
        super(TestPushHook, self).setUp()
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
355
356
    def capture_post_push_hook(self, result):
357
        """Capture post push hook calls to self.hook_calls.
358
359
        The call is logged, as is some state of the two branches.
360
        """
361
        if result.local_branch:
362
            local_locked = result.local_branch.is_locked()
363
            local_base = result.local_branch.base
364
        else:
365
            local_locked = None
366
            local_base = None
367
        self.hook_calls.append(
368
            ('post_push', result.source_branch, local_base,
369
             result.master_branch.base,
370
             result.old_revno, result.old_revid,
371
             result.new_revno, result.new_revid,
372
             result.source_branch.is_locked(), local_locked,
373
             result.master_branch.is_locked()))
374
375
    def test_post_push_empty_history(self):
376
        target = self.make_to_branch('target')
377
        source = self.make_from_branch('source')
378
        Branch.hooks.install_named_hook('post_push',
379
                                        self.capture_post_push_hook, None)
380
        source.push(target)
381
        # with nothing there we should still get a notification, and
382
        # have both branches locked at the notification time.
383
        self.assertEqual([
384
            ('post_push', source, None, target.base, 0, NULL_REVISION,
385
             0, NULL_REVISION, True, None, True)
386
            ],
387
            self.hook_calls)
388
389
    def test_post_push_bound_branch(self):
390
        # pushing to a bound branch should pass in the master branch to the
391
        # hook, allowing the correct number of emails to be sent, while still
392
        # allowing hooks that want to modify the target to do so to both
393
        # instances.
394
        target = self.make_to_branch('target')
395
        local = self.make_from_branch('local')
396
        try:
397
            local.bind(target)
398
        except errors.UpgradeRequired:
399
            # We can't bind this format to itself- typically it is the local
400
            # branch that doesn't support binding.  As of May 2007
401
            # remotebranches can't be bound.  Let's instead make a new local
402
            # branch of the default type, which does allow binding.
403
            # See https://bugs.launchpad.net/bzr/+bug/112020
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
404
            local = ControlDir.create_branch_convenience('local2')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
405
            local.bind(target)
406
        source = self.make_from_branch('source')
407
        Branch.hooks.install_named_hook('post_push',
408
                                        self.capture_post_push_hook, None)
409
        source.push(local)
410
        # with nothing there we should still get a notification, and
411
        # have both branches locked at the notification time.
412
        self.assertEqual([
413
            ('post_push', source, local.base, target.base, 0, NULL_REVISION,
414
             0, NULL_REVISION, True, True, True)
415
            ],
416
            self.hook_calls)
417
418
    def test_post_push_nonempty_history(self):
419
        target = self.make_to_branch_and_tree('target')
420
        target.lock_write()
421
        target.add('')
422
        rev1 = target.commit('rev 1')
423
        target.unlock()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
424
        sourcedir = target.branch.controldir.clone(self.get_url('source'))
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
425
        source = MemoryTree.create_on_branch(sourcedir.open_branch())
426
        rev2 = source.commit('rev 2')
427
        Branch.hooks.install_named_hook('post_push',
428
                                        self.capture_post_push_hook, None)
429
        source.branch.push(target.branch)
430
        # with nothing there we should still get a notification, and
431
        # have both branches locked at the notification time.
432
        self.assertEqual([
433
            ('post_push', source.branch, None, target.branch.base, 1, rev1,
434
             2, rev2, True, None, True)
435
            ],
436
            self.hook_calls)