/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/repofmt/groupcompress_repo.py

  • Committer: John Arbash Meinel
  • Date: 2009-06-18 19:19:49 UTC
  • mfrom: (4460 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4461.
  • Revision ID: john@arbash-meinel.com-20090618191949-gd8yfhunrqobru15
Merge bzr.dev 4460 resolving NEWS

Show diffs side-by-side

added added

removed removed

Lines of Context:
48
48
    Pack,
49
49
    NewPack,
50
50
    KnitPackRepository,
 
51
    KnitPackStreamSource,
51
52
    PackRootCommitBuilder,
52
53
    RepositoryPackCollection,
53
54
    RepositoryFormatPack,
777
778
        # make it raise to trap naughty direct users.
778
779
        raise NotImplementedError(self._iter_inventory_xmls)
779
780
 
780
 
    def _find_parent_ids_of_revisions(self, revision_ids):
781
 
        # TODO: we probably want to make this a helper that other code can get
782
 
        #       at
783
 
        parent_map = self.get_parent_map(revision_ids)
784
 
        parents = set()
785
 
        map(parents.update, parent_map.itervalues())
786
 
        parents.difference_update(revision_ids)
787
 
        parents.discard(_mod_revision.NULL_REVISION)
788
 
        return parents
789
 
 
790
 
    def _find_present_inventory_ids(self, revision_ids):
791
 
        keys = [(r,) for r in revision_ids]
792
 
        parent_map = self.inventories.get_parent_map(keys)
793
 
        present_inventory_ids = set(k[-1] for k in parent_map)
794
 
        return present_inventory_ids
 
781
    def _find_present_inventory_keys(self, revision_keys):
 
782
        parent_map = self.inventories.get_parent_map(revision_keys)
 
783
        present_inventory_keys = set(k for k in parent_map)
 
784
        return present_inventory_keys
795
785
 
796
786
    def fileids_altered_by_revision_ids(self, revision_ids, _inv_weave=None):
797
787
        """Find the file ids and versions affected by revisions.
808
798
        file_id_revisions = {}
809
799
        pb = ui.ui_factory.nested_progress_bar()
810
800
        try:
811
 
            parent_ids = self._find_parent_ids_of_revisions(revision_ids)
812
 
            present_parent_inv_ids = self._find_present_inventory_ids(parent_ids)
 
801
            revision_keys = [(r,) for r in revision_ids]
 
802
            parent_keys = self._find_parent_keys_of_revisions(revision_keys)
 
803
            # TODO: instead of using _find_present_inventory_keys, change the
 
804
            #       code paths to allow missing inventories to be tolerated.
 
805
            #       However, we only want to tolerate missing parent
 
806
            #       inventories, not missing inventories for revision_ids
 
807
            present_parent_inv_keys = self._find_present_inventory_keys(
 
808
                                        parent_keys)
 
809
            present_parent_inv_ids = set(
 
810
                [k[-1] for k in present_parent_inv_keys])
813
811
            uninteresting_root_keys = set()
814
812
            interesting_root_keys = set()
815
 
            inventories_to_read = set(present_parent_inv_ids)
816
 
            inventories_to_read.update(revision_ids)
 
813
            inventories_to_read = set(revision_ids)
 
814
            inventories_to_read.update(present_parent_inv_ids)
817
815
            for inv in self.iter_inventories(inventories_to_read):
818
816
                entry_chk_root_key = inv.id_to_entry.key()
819
817
                if inv.revision_id in present_parent_inv_ids:
887
885
        return super(CHKInventoryRepository, self)._get_source(to_format)
888
886
 
889
887
 
890
 
class GroupCHKStreamSource(repository.StreamSource):
 
888
class GroupCHKStreamSource(KnitPackStreamSource):
891
889
    """Used when both the source and target repo are GroupCHK repos."""
892
890
 
893
891
    def __init__(self, from_repository, to_format):
895
893
        super(GroupCHKStreamSource, self).__init__(from_repository, to_format)
896
894
        self._revision_keys = None
897
895
        self._text_keys = None
 
896
        self._text_fetch_order = 'groupcompress'
898
897
        self._chk_id_roots = None
899
898
        self._chk_p_id_roots = None
900
899
 
939
938
            p_id_roots_set.clear()
940
939
        return ('inventories', _filtered_inv_stream())
941
940
 
942
 
    def _find_present_inventories(self, revision_ids):
943
 
        revision_keys = [(r,) for r in revision_ids]
944
 
        inventories = self.from_repository.inventories
945
 
        present_inventories = inventories.get_parent_map(revision_keys)
946
 
        return [p[-1] for p in present_inventories]
947
 
 
948
 
    def _get_filtered_chk_streams(self, excluded_revision_ids):
 
941
    def _get_filtered_chk_streams(self, excluded_revision_keys):
949
942
        self._text_keys = set()
950
 
        excluded_revision_ids.discard(_mod_revision.NULL_REVISION)
951
 
        if not excluded_revision_ids:
 
943
        excluded_revision_keys.discard(_mod_revision.NULL_REVISION)
 
944
        if not excluded_revision_keys:
952
945
            uninteresting_root_keys = set()
953
946
            uninteresting_pid_root_keys = set()
954
947
        else:
956
949
            # actually present
957
950
            # TODO: Update Repository.iter_inventories() to add
958
951
            #       ignore_missing=True
959
 
            present_ids = self.from_repository._find_present_inventory_ids(
960
 
                            excluded_revision_ids)
961
 
            present_ids = self._find_present_inventories(excluded_revision_ids)
 
952
            present_keys = self.from_repository._find_present_inventory_keys(
 
953
                            excluded_revision_keys)
 
954
            present_ids = [k[-1] for k in present_keys]
962
955
            uninteresting_root_keys = set()
963
956
            uninteresting_pid_root_keys = set()
964
957
            for inv in self.from_repository.iter_inventories(present_ids):
989
982
            self._chk_p_id_roots = None
990
983
        yield 'chk_bytes', _get_parent_id_basename_to_file_id_pages()
991
984
 
992
 
    def _get_text_stream(self):
993
 
        # Note: We know we don't have to handle adding root keys, because both
994
 
        # the source and target are GCCHK, and those always support rich-roots
995
 
        # We may want to request as 'unordered', in case the source has done a
996
 
        # 'split' packing
997
 
        return ('texts', self.from_repository.texts.get_record_stream(
998
 
                            self._text_keys, 'groupcompress', False))
999
 
 
1000
985
    def get_stream(self, search):
1001
986
        revision_ids = search.get_keys()
1002
987
        for stream_info in self._fetch_revision_texts(revision_ids):
1007
992
        # For now, exclude all parents that are at the edge of ancestry, for
1008
993
        # which we have inventories
1009
994
        from_repo = self.from_repository
1010
 
        parent_ids = from_repo._find_parent_ids_of_revisions(revision_ids)
1011
 
        for stream_info in self._get_filtered_chk_streams(parent_ids):
 
995
        parent_keys = from_repo._find_parent_keys_of_revisions(
 
996
                        self._revision_keys)
 
997
        for stream_info in self._get_filtered_chk_streams(parent_keys):
1012
998
            yield stream_info
1013
999
        yield self._get_text_stream()
1014
1000
 
1032
1018
        # no unavailable texts when the ghost inventories are not filled in.
1033
1019
        yield self._get_inventory_stream(missing_inventory_keys,
1034
1020
                                         allow_absent=True)
1035
 
        # We use the empty set for excluded_revision_ids, to make it clear that
1036
 
        # we want to transmit all referenced chk pages.
 
1021
        # We use the empty set for excluded_revision_keys, to make it clear
 
1022
        # that we want to transmit all referenced chk pages.
1037
1023
        for stream_info in self._get_filtered_chk_streams(set()):
1038
1024
            yield stream_info
1039
1025