734 ishead[e[5]] = ishead[e[6]] = 0 # my parent are not |
734 ishead[e[5]] = ishead[e[6]] = 0 # my parent are not |
735 return [r for r, val in enumerate(ishead) if val] |
735 return [r for r, val in enumerate(ishead) if val] |
736 |
736 |
737 |
737 |
738 class IndexObject(BaseIndexObject): |
738 class IndexObject(BaseIndexObject): |
739 def __init__(self, data: ByteString): |
739 def __init__(self, data: ByteString, uses_generaldelta=False): |
740 assert len(data) % self.entry_size == 0, ( |
740 assert len(data) % self.entry_size == 0, ( |
741 len(data), |
741 len(data), |
742 self.entry_size, |
742 self.entry_size, |
743 len(data) % self.entry_size, |
743 len(data) % self.entry_size, |
744 ) |
744 ) |
811 else: |
811 else: |
812 self._nm_root = self._nm_max_idx = self._nm_docket = None |
812 self._nm_root = self._nm_max_idx = self._nm_docket = None |
813 |
813 |
814 |
814 |
815 class InlinedIndexObject(BaseIndexObject): |
815 class InlinedIndexObject(BaseIndexObject): |
816 def __init__(self, data, inline=0): |
816 def __init__(self, data, inline=0, uses_generaldelta=False): |
817 self._data = data |
817 self._data = data |
818 self._lgt = self._inline_scan(None) |
818 self._lgt = self._inline_scan(None) |
819 self._inline_scan(self._lgt) |
819 self._inline_scan(self._lgt) |
820 self._extra = [] |
820 self._extra = [] |
821 |
821 |
854 def _calculate_index(self, i: int) -> int: |
854 def _calculate_index(self, i: int) -> int: |
855 return self._offsets[i] |
855 return self._offsets[i] |
856 |
856 |
857 |
857 |
858 def parse_index2( |
858 def parse_index2( |
859 data: ByteString, inline, format=revlog_constants.REVLOGV1 |
859 data: ByteString, |
|
860 inline, |
|
861 uses_generaldelta, |
|
862 format=revlog_constants.REVLOGV1, |
860 ) -> tuple[IndexObject | InlinedIndexObject, tuple[int, ByteString] | None]: |
863 ) -> tuple[IndexObject | InlinedIndexObject, tuple[int, ByteString] | None]: |
861 if format == revlog_constants.CHANGELOGV2: |
864 if format == revlog_constants.CHANGELOGV2: |
862 return parse_index_cl_v2(data) |
865 return parse_index_cl_v2(data) |
863 if not inline: |
866 if not inline: |
864 if format == revlog_constants.REVLOGV2: |
867 if format == revlog_constants.REVLOGV2: |
865 cls = IndexObject2 |
868 cls = IndexObject2 |
866 else: |
869 else: |
867 cls = IndexObject |
870 cls = IndexObject |
868 return cls(data), None |
871 return cls(data, uses_generaldelta), None |
869 cls = InlinedIndexObject |
872 cls = InlinedIndexObject |
870 return cls(data, inline), (0, data) |
873 return cls(data, inline, uses_generaldelta), (0, data) |
871 |
874 |
872 |
875 |
873 def parse_index_cl_v2(data): |
876 def parse_index_cl_v2(data): |
874 return IndexChangelogV2(data), None |
877 return IndexChangelogV2(data), None |
875 |
878 |
984 entry[revlog_constants.ENTRY_RANK], |
987 entry[revlog_constants.ENTRY_RANK], |
985 ) |
988 ) |
986 return self.index_format.pack(*data) |
989 return self.index_format.pack(*data) |
987 |
990 |
988 |
991 |
989 def parse_index_devel_nodemap(data, inline): |
992 def parse_index_devel_nodemap(data, inline, uses_generaldelta): |
990 """like parse_index2, but alway return a PersistentNodeMapIndexObject""" |
993 """like parse_index2, but always return a PersistentNodeMapIndexObject""" |
991 return PersistentNodeMapIndexObject(data), None |
994 return PersistentNodeMapIndexObject(data, uses_generaldelta), None |
992 |
995 |
993 |
996 |
994 def parse_dirstate(dmap, copymap, st): |
997 def parse_dirstate(dmap, copymap, st): |
995 parents = [st[:20], st[20:40]] |
998 parents = [st[:20], st[20:40]] |
996 # dereference fields so they will be local in loop |
999 # dereference fields so they will be local in loop |