/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
7141.5.1 by Jelmer Vernooij
Fix fetching between non-default git branches.
182
    def test_between_colocated(self):
183
        """Pushing from one colocated branch to another doesn't change the active branch."""
184
        source = self.make_from_branch_and_tree('source')
185
        target = self.make_to_branch('target')
186
187
        self.build_tree(['source/a'])
188
        source.add(['a'])
189
        revid1 = source.commit('a')
190
191
        self.build_tree(['source/b'])
192
        source.add(['b'])
193
        revid2 = source.commit('b')
194
195
        source_colo = source.controldir.create_branch('colo')
196
        source_colo.generate_revision_history(revid1)
197
        try:
198
            source_colo.push(target)
199
        except errors.NoRoundtrippingSupport:
200
            raise tests.TestNotApplicable(
201
                'push between branches of different format')
202
        self.assertEqual(source_colo.last_revision(), revid1)
203
        self.assertEqual(source.last_revision(), revid2)
204
        self.assertEqual(target.last_revision(), revid1)
205
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
206
    def test_push_within_repository(self):
207
        """Push from one branch to another inside the same repository."""
208
        try:
209
            repo = self.make_repository('repo', shared=True)
210
        except (errors.IncompatibleFormat, errors.UninitializableFormat):
211
            # This Branch format cannot create shared repositories
212
            return
5297.2.2 by Robert Collins
Fixup tests in per_interbranch not being strict about making the from format the configured one.
213
        # This is a little bit trickier because make_from_branch_and_tree will not
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
214
        # re-use a shared repository.
215
        try:
216
            a_branch = self.make_from_branch('repo/tree')
217
        except (errors.UninitializableFormat):
218
            # Cannot create these branches
219
            return
220
        try:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
221
            tree = a_branch.controldir.create_workingtree()
6127.1.9 by Jelmer Vernooij
Add lightweight option to _get_checkout_format().
222
        except errors.UnsupportedOperation:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
223
            self.assertFalse(a_branch.controldir._format.supports_workingtrees)
6127.1.9 by Jelmer Vernooij
Add lightweight option to _get_checkout_format().
224
            tree = a_branch.create_checkout('repo/tree', lightweight=True)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
225
        except errors.NotLocalUrl:
5017.3.41 by Vincent Ladeuil
-s bt.per_interbranch passing
226
            if self.vfs_transport_factory is test_server.LocalURLServer:
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
227
                # the branch is colocated on disk, we cannot create a checkout.
228
                # hopefully callers will expect this.
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
229
                local_controldir = controldir.ControlDir.open(self.get_vfs_only_url('repo/tree'))
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
230
                tree = local_controldir.create_workingtree()
231
            else:
232
                tree = a_branch.create_checkout('repo/tree', lightweight=True)
233
        self.build_tree(['repo/tree/a'])
234
        tree.add(['a'])
235
        tree.commit('a')
236
237
        to_branch = self.make_to_branch('repo/branch')
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
238
        try:
239
            tree.branch.push(to_branch)
240
        except errors.NoRoundtrippingSupport:
241
            tree.branch.push(to_branch, lossy=True)
242
        else:
243
            self.assertEqual(tree.branch.last_revision(),
244
                             to_branch.last_revision())
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
245
246
    def test_push_overwrite_of_non_tip_with_stop_revision(self):
247
        """Combining the stop_revision and overwrite options works.
248
249
        This was <https://bugs.launchpad.net/bzr/+bug/234229>.
250
        """
251
        source = self.make_from_branch_and_tree('source')
252
        target = self.make_to_branch('target')
253
254
        source.commit('1st commit')
6883.21.1 by Jelmer Vernooij
Allow InterBranch formats to raise NoRoundtrippingSupport.
255
        try:
256
            source.branch.push(target)
257
        except errors.NoRoundtrippingSupport:
258
            raise tests.TestNotApplicable(
259
                'lossless push between %r and %r not supported' %
260
                (self.branch_format_from, self.branch_format_to))
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
261
        rev2 = source.commit('2nd commit')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
262
        source.commit('3rd commit')
263
6747.3.1 by Jelmer Vernooij
Avoid more uses of revision_id.
264
        source.branch.push(target, stop_revision=rev2, overwrite=True)
265
        self.assertEqual(rev2, target.last_revision())
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
266
267
    def test_push_with_default_stacking_does_not_create_broken_branch(self):
268
        """Pushing a new standalone branch works even when there's a default
269
        stacking policy at the destination.
270
271
        The new branch will preserve the repo format (even if it isn't the
272
        default for the branch), and will be stacked when the repo format
273
        allows (which means that the branch format isn't necessarly preserved).
274
        """
6653.1.1 by Jelmer Vernooij
Split bzr branch code out into breezy.bzrbranch.
275
        if isinstance(self.branch_format_from, bzrbranch.BranchReferenceFormat):
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
276
            # This test could in principle apply to BranchReferenceFormat, but
277
            # make_branch_builder doesn't support it.
278
            raise tests.TestSkipped(
279
                "BranchBuilder can't make reference branches.")
280
        # Make a branch called "local" in a stackable repository
281
        # The branch has 3 revisions:
282
        #   - rev-1, adds a file
283
        #   - rev-2, no changes
284
        #   - rev-3, modifies the file.
285
        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.
286
        try:
287
            builder = self.make_from_branch_builder('repo/local')
288
        except errors.UninitializableFormat:
289
            raise tests.TestNotApplicable(
290
                'BranchBuilder can not initialize some formats')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
291
        builder.start_series()
6821.2.2 by Jelmer Vernooij
More foreign fixes.
292
        revid1 = builder.build_snapshot(None, [
6883.22.13 by Jelmer Vernooij
Actually pass in None file-ids to BranchBuilder.
293
            ('add', ('', None, 'directory', '')),
6973.6.2 by Jelmer Vernooij
Fix more tests.
294
            ('add', ('filename', None, 'file', b'content\n'))])
6821.2.2 by Jelmer Vernooij
More foreign fixes.
295
        revid2 = builder.build_snapshot([revid1], [])
296
        revid3 = builder.build_snapshot([revid2],
6973.6.2 by Jelmer Vernooij
Fix more tests.
297
            [('modify', ('filename', b'new-content\n'))])
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
298
        builder.finish_series()
299
        trunk = builder.get_branch()
300
        # Sprout rev-1 to "trunk", so that we can stack on it.
6821.2.2 by Jelmer Vernooij
More foreign fixes.
301
        trunk.controldir.sprout(self.get_url('trunk'), revision_id=revid1)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
302
        # Set a default stacking policy so that new branches will automatically
303
        # stack on trunk.
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
304
        self.make_controldir('.').get_config().set_default_stack_on('trunk')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
305
        # 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
306
        output = BytesIO()
6821.2.2 by Jelmer Vernooij
More foreign fixes.
307
        push._show_push_branch(trunk, revid2, self.get_url('remote'), output)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
308
        # Push rev-3 onto "remote".  If "remote" not stacked and is missing the
309
        # fulltext record for f-id @ rev-1, then this will fail.
310
        remote_branch = Branch.open(self.get_url('remote'))
311
        trunk.push(remote_branch)
4332.3.35 by Robert Collins
Fix failing tests.
312
        check.check_dwim(remote_branch.base, False, True, True)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
313
314
    def test_no_get_parent_map_after_insert_stream(self):
315
        # Effort test for bug 331823
316
        self.setup_smart_server_with_call_log()
317
        # Make a local branch with four revisions.  Four revisions because:
318
        # one to push, one there for _walk_to_common_revisions to find, one we
319
        # don't want to access, one for luck :)
6653.1.1 by Jelmer Vernooij
Split bzr branch code out into breezy.bzrbranch.
320
        if isinstance(self.branch_format_from, bzrbranch.BranchReferenceFormat):
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
321
            # This test could in principle apply to BranchReferenceFormat, but
322
            # make_branch_builder doesn't support it.
323
            raise tests.TestSkipped(
324
                "BranchBuilder can't make reference branches.")
325
        try:
326
            builder = self.make_from_branch_builder('local')
327
        except (errors.TransportNotPossible, errors.UninitializableFormat):
328
            raise tests.TestNotApplicable('format not directly constructable')
329
        builder.start_series()
6821.2.2 by Jelmer Vernooij
More foreign fixes.
330
        first = builder.build_snapshot(None, [
6883.22.13 by Jelmer Vernooij
Actually pass in None file-ids to BranchBuilder.
331
            ('add', ('', None, 'directory', ''))])
6821.2.2 by Jelmer Vernooij
More foreign fixes.
332
        second = builder.build_snapshot([first], [])
333
        third = builder.build_snapshot([second], [])
334
        fourth = builder.build_snapshot([third], [])
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
335
        builder.finish_series()
336
        local = branch.Branch.open(self.get_vfs_only_url('local'))
337
        # Initial push of three revisions
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
338
        remote_bzrdir = local.controldir.sprout(
6821.2.2 by Jelmer Vernooij
More foreign fixes.
339
            self.get_url('remote'), revision_id=third)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
340
        remote = remote_bzrdir.open_branch()
6876.7.1 by Jelmer Vernooij
Only check for certain HPSS behaviour for vf repositories.
341
        if not remote.repository._format.supports_full_versioned_files:
342
            raise tests.TestNotApplicable(
343
                'remote is not a VersionedFile repository')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
344
        # Push fourth revision
345
        self.reset_smart_call_log()
346
        self.disableOptimisticGetParentMap()
347
        self.assertFalse(local.is_locked())
348
        local.push(remote)
349
        hpss_call_names = [item.call.method for item in self.hpss_calls]
7045.4.1 by Jelmer Vernooij
Some brz-git fixes.
350
        self.assertIn(b'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.
351
        insert_stream_idx = hpss_call_names.index(
7045.4.1 by Jelmer Vernooij
Some brz-git fixes.
352
            b'Repository.insert_stream_1.19')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
353
        calls_after_insert_stream = hpss_call_names[insert_stream_idx:]
354
        # After inserting the stream the client has no reason to query the
355
        # 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.
356
        bzr_core_trace = Equals(
7045.4.1 by Jelmer Vernooij
Some brz-git fixes.
357
            [b'Repository.insert_stream_1.19', b'Repository.insert_stream_1.19',
358
             b'Branch.set_last_revision_info', b'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.
359
        bzr_loom_trace = Equals(
7045.4.1 by Jelmer Vernooij
Some brz-git fixes.
360
            [b'Repository.insert_stream_1.19', b'Repository.insert_stream_1.19',
361
             b'Branch.set_last_revision_info', b'get', b'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.
362
        self.assertThat(calls_after_insert_stream,
363
            MatchesAny(bzr_core_trace, bzr_loom_trace))
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
364
365
    def disableOptimisticGetParentMap(self):
366
        # Tweak some class variables to stop remote get_parent_map calls asking
367
        # for or receiving more data than the caller asked for.
5863.4.2 by Jelmer Vernooij
Fix test.
368
        self.overrideAttr(vf_repository.InterVersionedFileRepository,
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
369
                          '_walk_to_common_revisions_batch_size', 1)
370
        self.overrideAttr(SmartServerRepositoryGetParentMap,
371
                            'no_extra_results', True)
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
372
373
374
class TestPushHook(TestCaseWithInterBranch):
375
376
    def setUp(self):
377
        self.hook_calls = []
6552.1.4 by Vincent Ladeuil
Remaining tests matching setup(self) that can be rewritten with super().
378
        super(TestPushHook, self).setUp()
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
379
380
    def capture_post_push_hook(self, result):
381
        """Capture post push hook calls to self.hook_calls.
382
383
        The call is logged, as is some state of the two branches.
384
        """
385
        if result.local_branch:
386
            local_locked = result.local_branch.is_locked()
387
            local_base = result.local_branch.base
388
        else:
389
            local_locked = None
390
            local_base = None
391
        self.hook_calls.append(
392
            ('post_push', result.source_branch, local_base,
393
             result.master_branch.base,
394
             result.old_revno, result.old_revid,
395
             result.new_revno, result.new_revid,
396
             result.source_branch.is_locked(), local_locked,
397
             result.master_branch.is_locked()))
398
399
    def test_post_push_empty_history(self):
400
        target = self.make_to_branch('target')
401
        source = self.make_from_branch('source')
402
        Branch.hooks.install_named_hook('post_push',
403
                                        self.capture_post_push_hook, None)
404
        source.push(target)
405
        # with nothing there we should still get a notification, and
406
        # have both branches locked at the notification time.
407
        self.assertEqual([
408
            ('post_push', source, None, target.base, 0, NULL_REVISION,
409
             0, NULL_REVISION, True, None, True)
410
            ],
411
            self.hook_calls)
412
413
    def test_post_push_bound_branch(self):
414
        # pushing to a bound branch should pass in the master branch to the
415
        # hook, allowing the correct number of emails to be sent, while still
416
        # allowing hooks that want to modify the target to do so to both
417
        # instances.
418
        target = self.make_to_branch('target')
419
        local = self.make_from_branch('local')
420
        try:
421
            local.bind(target)
422
        except errors.UpgradeRequired:
423
            # We can't bind this format to itself- typically it is the local
424
            # branch that doesn't support binding.  As of May 2007
425
            # remotebranches can't be bound.  Let's instead make a new local
426
            # branch of the default type, which does allow binding.
427
            # See https://bugs.launchpad.net/bzr/+bug/112020
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
428
            local = ControlDir.create_branch_convenience('local2')
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
429
            local.bind(target)
430
        source = self.make_from_branch('source')
431
        Branch.hooks.install_named_hook('post_push',
432
                                        self.capture_post_push_hook, None)
433
        source.push(local)
434
        # with nothing there we should still get a notification, and
435
        # have both branches locked at the notification time.
436
        self.assertEqual([
437
            ('post_push', source, local.base, target.base, 0, NULL_REVISION,
438
             0, NULL_REVISION, True, True, True)
439
            ],
440
            self.hook_calls)
441
442
    def test_post_push_nonempty_history(self):
443
        target = self.make_to_branch_and_tree('target')
444
        target.lock_write()
445
        target.add('')
446
        rev1 = target.commit('rev 1')
447
        target.unlock()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
448
        sourcedir = target.branch.controldir.clone(self.get_url('source'))
4211.1.4 by Jelmer Vernooij
add InterBranch.push() tests.
449
        source = MemoryTree.create_on_branch(sourcedir.open_branch())
450
        rev2 = source.commit('rev 2')
451
        Branch.hooks.install_named_hook('post_push',
452
                                        self.capture_post_push_hook, None)
453
        source.branch.push(target.branch)
454
        # with nothing there we should still get a notification, and
455
        # have both branches locked at the notification time.
456
        self.assertEqual([
457
            ('post_push', source.branch, None, target.branch.base, 1, rev1,
458
             2, rev2, True, None, True)
459
            ],
460
            self.hook_calls)