~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/versionedfile.py

(jam) Fix bug #304841,
        sort requests topologically and properly only check compression
        parent.

Show diffs side-by-side

added added

removed removed

Lines of Context:
521
521
    """
522
522
 
523
523
    def __init__(self, backing_vf):
524
 
        """Create a RecordingVersionedFileDsecorator decorating backing_vf.
 
524
        """Create a RecordingVersionedFilesDecorator decorating backing_vf.
525
525
        
526
526
        :param backing_vf: The versioned file to answer all methods.
527
527
        """
562
562
        return self._backing_vf.keys()
563
563
 
564
564
 
 
565
class OrderingVersionedFilesDecorator(RecordingVersionedFilesDecorator):
 
566
    """A VF that records calls, and returns keys in specific order.
 
567
 
 
568
    :ivar calls: A list of the calls made; can be reset at any time by
 
569
        assigning [] to it.
 
570
    """
 
571
 
 
572
    def __init__(self, backing_vf, key_priority):
 
573
        """Create a RecordingVersionedFilesDecorator decorating backing_vf.
 
574
 
 
575
        :param backing_vf: The versioned file to answer all methods.
 
576
        :param key_priority: A dictionary defining what order keys should be
 
577
            returned from an 'unordered' get_record_stream request.
 
578
            Keys with lower priority are returned first, keys not present in
 
579
            the map get an implicit priority of 0, and are returned in
 
580
            lexicographical order.
 
581
        """
 
582
        RecordingVersionedFilesDecorator.__init__(self, backing_vf)
 
583
        self._key_priority = key_priority
 
584
 
 
585
    def get_record_stream(self, keys, sort_order, include_delta_closure):
 
586
        self.calls.append(("get_record_stream", list(keys), sort_order,
 
587
            include_delta_closure))
 
588
        if sort_order == 'unordered':
 
589
            def sort_key(key):
 
590
                return (self._key_priority.get(key, 0), key)
 
591
            # Use a defined order by asking for the keys one-by-one from the
 
592
            # backing_vf
 
593
            for key in sorted(keys, key=sort_key):
 
594
                for record in self._backing_vf.get_record_stream([key],
 
595
                                'unordered', include_delta_closure):
 
596
                    yield record
 
597
        else:
 
598
            for record in self._backing_vf.get_record_stream(keys, sort_order,
 
599
                            include_delta_closure):
 
600
                yield record
 
601
 
 
602
 
565
603
class KeyMapper(object):
566
604
    """KeyMappers map between keys and underlying partitioned storage."""
567
605