/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/branch_implementations/test_push.py

  • Committer: Jelmer Vernooij
  • Date: 2009-02-25 14:36:59 UTC
  • mfrom: (4048 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4049.
  • Revision ID: jelmer@samba.org-20090225143659-vx6cbqtmyicuzfyf
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
from cStringIO import StringIO
20
20
import os
21
 
 
 
21
 
22
22
from bzrlib import (
23
23
    branch,
24
24
    builtins,
26
26
    debug,
27
27
    errors,
28
28
    push,
 
29
    repository,
29
30
    tests,
30
31
    )
31
32
from bzrlib.branch import Branch
33
34
from bzrlib.memorytree import MemoryTree
34
35
from bzrlib.revision import NULL_REVISION
35
36
from bzrlib.smart import client, server
 
37
from bzrlib.smart.repository import SmartServerRepositoryGetParentMap
36
38
from bzrlib.tests.branch_implementations.test_branch import TestCaseWithBranch
37
39
from bzrlib.transport import get_transport
38
40
from bzrlib.transport.local import LocalURLServer
41
43
class TestPush(TestCaseWithBranch):
42
44
 
43
45
    def test_push_convergence_simple(self):
44
 
        # when revisions are pushed, the left-most accessible parents must 
 
46
        # when revisions are pushed, the left-most accessible parents must
45
47
        # become the revision-history.
46
48
        mine = self.make_branch_and_tree('mine')
47
49
        mine.commit('1st post', rev_id='P1', allow_pointless=True)
165
167
 
166
168
    def test_push_overwrite_of_non_tip_with_stop_revision(self):
167
169
        """Combining the stop_revision and overwrite options works.
168
 
        
 
170
 
169
171
        This was <https://bugs.launchpad.net/bzr/+bug/234229>.
170
172
        """
171
173
        source = self.make_branch_and_tree('source')
224
226
        trunk.push(remote_branch)
225
227
        remote_branch.check()
226
228
 
 
229
    def test_no_get_parent_map_after_insert_stream(self):
 
230
        # Effort test for bug 331823
 
231
        self.setup_smart_server_with_call_log()
 
232
        # Make a local branch with four revisions.  Four revisions because:
 
233
        # one to push, one there for _walk_to_common_revisions to find, one we
 
234
        # don't want to access, one for luck :)
 
235
        if isinstance(self.branch_format, branch.BranchReferenceFormat):
 
236
            # This test could in principle apply to BranchReferenceFormat, but
 
237
            # make_branch_builder doesn't support it.
 
238
            raise tests.TestSkipped(
 
239
                "BranchBuilder can't make reference branches.")
 
240
        try:
 
241
            builder = self.make_branch_builder('local')
 
242
        except (errors.TransportNotPossible, errors.UninitializableFormat):
 
243
            raise tests.TestNotApplicable('format not directly constructable')
 
244
        builder.start_series()
 
245
        builder.build_snapshot('first', None, [
 
246
            ('add', ('', 'root-id', 'directory', ''))])
 
247
        builder.build_snapshot('second', ['first'], [])
 
248
        builder.build_snapshot('third', ['second'], [])
 
249
        builder.build_snapshot('fourth', ['third'], [])
 
250
        builder.finish_series()
 
251
        local = builder.get_branch()
 
252
        local = branch.Branch.open(self.get_vfs_only_url('local'))
 
253
        # Initial push of three revisions
 
254
        remote_bzrdir = local.bzrdir.sprout(
 
255
            self.get_url('remote'), revision_id='third')
 
256
        remote = remote_bzrdir.open_branch()
 
257
        # Push fourth revision
 
258
        self.reset_smart_call_log()
 
259
        self.disableOptimisticGetParentMap()
 
260
        self.assertFalse(local.is_locked())
 
261
        local.push(remote)
 
262
        hpss_call_names = [item[0].method for item in self.hpss_calls]
 
263
        self.assertTrue('Repository.insert_stream' in hpss_call_names)
 
264
        insert_stream_idx = hpss_call_names.index('Repository.insert_stream')
 
265
        calls_after_insert_stream = hpss_call_names[insert_stream_idx:]
 
266
        # After inserting the stream the client has no reason to query the
 
267
        # remote graph any further.
 
268
        self.assertEqual(
 
269
            ['Repository.insert_stream', 'Repository.insert_stream', 'get',
 
270
             'Branch.set_last_revision_info', 'Branch.unlock'],
 
271
            calls_after_insert_stream)
 
272
 
 
273
    def disableOptimisticGetParentMap(self):
 
274
        # Tweak some class variables to stop remote get_parent_map calls asking
 
275
        # for or receiving more data than the caller asked for.
 
276
        old_flag = SmartServerRepositoryGetParentMap.no_extra_results
 
277
        inter_classes = [repository.InterOtherToRemote,
 
278
            repository.InterPackToRemotePack]
 
279
        old_batch_sizes = []
 
280
        for inter_class in inter_classes:
 
281
            old_batch_sizes.append(
 
282
                inter_class._walk_to_common_revisions_batch_size)
 
283
            inter_class._walk_to_common_revisions_batch_size = 1
 
284
        SmartServerRepositoryGetParentMap.no_extra_results = True
 
285
        def reset_values():
 
286
            SmartServerRepositoryGetParentMap.no_extra_results = old_flag
 
287
            for inter_class, size in zip(inter_classes, old_batch_sizes):
 
288
                inter_class._walk_to_common_revisions_batch_size = size
 
289
        self.addCleanup(reset_values)
 
290
 
227
291
 
228
292
class TestPushHook(TestCaseWithBranch):
229
293
 
233
297
 
234
298
    def capture_post_push_hook(self, result):
235
299
        """Capture post push hook calls to self.hook_calls.
236
 
        
 
300
 
237
301
        The call is logged, as is some state of the two branches.
238
302
        """
239
303
        if result.local_branch:
267
331
    def test_post_push_bound_branch(self):
268
332
        # pushing to a bound branch should pass in the master branch to the
269
333
        # hook, allowing the correct number of emails to be sent, while still
270
 
        # allowing hooks that want to modify the target to do so to both 
 
334
        # allowing hooks that want to modify the target to do so to both
271
335
        # instances.
272
336
        target = self.make_branch('target')
273
337
        local = self.make_branch('local')