~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_fetch.py

  • Committer: Robert Collins
  • Date: 2008-09-02 05:28:37 UTC
  • mfrom: (3675 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3677.
  • Revision ID: robertc@robertcollins.net-20080902052837-ec3qlv41q5e7f6fl
Resolve conflicts with NEWS.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
    errors,
25
25
    merge,
26
26
    repository,
 
27
    versionedfile,
27
28
    )
28
29
from bzrlib.branch import Branch
29
30
from bzrlib.bzrdir import BzrDir
329
330
        self.assertEqual(4, len(http_logs))
330
331
 
331
332
 
 
333
class TestKnitToPackFetch(TestCaseWithTransport):
 
334
 
 
335
    def find_get_record_stream(self, calls):
 
336
        """In a list of calls, find 'get_record_stream' calls.
 
337
 
 
338
        This also ensures that there is only one get_record_stream call.
 
339
        """
 
340
        get_record_call = None
 
341
        for call in calls:
 
342
            if call[0] == 'get_record_stream':
 
343
                self.assertIs(None, get_record_call,
 
344
                              "there should only be one call to"
 
345
                              " get_record_stream")
 
346
                get_record_call = call
 
347
        self.assertIsNot(None, get_record_call,
 
348
                         "there should be exactly one call to "
 
349
                         " get_record_stream")
 
350
        return get_record_call
 
351
 
 
352
    def test_fetch_with_deltas_no_delta_closure(self):
 
353
        tree = self.make_branch_and_tree('source', format='dirstate')
 
354
        target = self.make_repository('target', format='pack-0.92')
 
355
        self.build_tree(['source/file'])
 
356
        tree.set_root_id('root-id')
 
357
        tree.add('file', 'file-id')
 
358
        tree.commit('one', rev_id='rev-one')
 
359
        source = tree.branch.repository
 
360
        source.texts = versionedfile.RecordingVersionedFilesDecorator(
 
361
                        source.texts)
 
362
        source.signatures = versionedfile.RecordingVersionedFilesDecorator(
 
363
                        source.signatures)
 
364
        source.revisions = versionedfile.RecordingVersionedFilesDecorator(
 
365
                        source.revisions)
 
366
        source.inventories = versionedfile.RecordingVersionedFilesDecorator(
 
367
                        source.inventories)
 
368
        # precondition
 
369
        self.assertTrue(target._fetch_uses_deltas)
 
370
        target.fetch(source, revision_id='rev-one')
 
371
        self.assertEqual(('get_record_stream', [('file-id', 'rev-one')],
 
372
                          target._fetch_order, False),
 
373
                         self.find_get_record_stream(source.texts.calls))
 
374
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
375
                          target._fetch_order, False),
 
376
                         self.find_get_record_stream(source.inventories.calls))
 
377
        # Because of bugs in the old fetch code, revisions could accidentally
 
378
        # have deltas present in knits. However, it was never intended, so we
 
379
        # always for include_delta_closure=True, to make sure we get fulltexts.
 
380
        # bug #261339
 
381
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
382
                          target._fetch_order, True),
 
383
                         self.find_get_record_stream(source.revisions.calls))
 
384
        # XXX: Signatures is special, and slightly broken. The
 
385
        # standard item_keys_introduced_by actually does a lookup for every
 
386
        # signature to see if it exists, rather than waiting to do them all at
 
387
        # once at the end. The fetch code then does an all-at-once and just
 
388
        # allows for some of them to be missing.
 
389
        # So we know there will be extra calls, but the *last* one is the one
 
390
        # we care about.
 
391
        signature_calls = source.signatures.calls[-1:]
 
392
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
393
                          target._fetch_order, True),
 
394
                         self.find_get_record_stream(signature_calls))
 
395
 
 
396
    def test_fetch_no_deltas_with_delta_closure(self):
 
397
        tree = self.make_branch_and_tree('source', format='dirstate')
 
398
        target = self.make_repository('target', format='pack-0.92')
 
399
        self.build_tree(['source/file'])
 
400
        tree.set_root_id('root-id')
 
401
        tree.add('file', 'file-id')
 
402
        tree.commit('one', rev_id='rev-one')
 
403
        source = tree.branch.repository
 
404
        source.texts = versionedfile.RecordingVersionedFilesDecorator(
 
405
                        source.texts)
 
406
        source.signatures = versionedfile.RecordingVersionedFilesDecorator(
 
407
                        source.signatures)
 
408
        source.revisions = versionedfile.RecordingVersionedFilesDecorator(
 
409
                        source.revisions)
 
410
        source.inventories = versionedfile.RecordingVersionedFilesDecorator(
 
411
                        source.inventories)
 
412
        target._fetch_uses_deltas = False
 
413
        target.fetch(source, revision_id='rev-one')
 
414
        self.assertEqual(('get_record_stream', [('file-id', 'rev-one')],
 
415
                          target._fetch_order, True),
 
416
                         self.find_get_record_stream(source.texts.calls))
 
417
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
418
                          target._fetch_order, True),
 
419
                         self.find_get_record_stream(source.inventories.calls))
 
420
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
421
                          target._fetch_order, True),
 
422
                         self.find_get_record_stream(source.revisions.calls))
 
423
        # XXX: Signatures is special, and slightly broken. The
 
424
        # standard item_keys_introduced_by actually does a lookup for every
 
425
        # signature to see if it exists, rather than waiting to do them all at
 
426
        # once at the end. The fetch code then does an all-at-once and just
 
427
        # allows for some of them to be missing.
 
428
        # So we know there will be extra calls, but the *last* one is the one
 
429
        # we care about.
 
430
        signature_calls = source.signatures.calls[-1:]
 
431
        self.assertEqual(('get_record_stream', [('rev-one',)],
 
432
                          target._fetch_order, True),
 
433
                         self.find_get_record_stream(signature_calls))
 
434
 
 
435
 
332
436
class Test1To2Fetch(TestCaseWithTransport):
333
437
    """Tests for Model1To2 failure modes"""
334
438