comparison mercurial/pure/parsers.py @ 46860:1dc86c2a43ce

revlog: directly use the Struct object for related operation The Struct object has all the piece we needs, so no need to duplicate information on the revlog itself. Differential Revision: https://phab.mercurial-scm.org/D10307
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 05 Apr 2021 12:21:58 +0200
parents 85e3a630cad9
children 3c9208702db3
comparison
equal deleted inserted replaced
46859:c6e23fb4bfb4 46860:1dc86c2a43ce
42 return int(int(offset) << 16 | type) 42 return int(int(offset) << 16 | type)
43 43
44 44
45 class BaseIndexObject(object): 45 class BaseIndexObject(object):
46 # Format of an index entry according to Python's `struct` language 46 # Format of an index entry according to Python's `struct` language
47 index_format = revlog_constants.INDEX_ENTRY_V1.format 47 index_format = revlog_constants.INDEX_ENTRY_V1
48 # Size of a C unsigned long long int, platform independent 48 # Size of a C unsigned long long int, platform independent
49 big_int_size = struct.calcsize(b'>Q') 49 big_int_size = struct.calcsize(b'>Q')
50 # Size of a C long int, platform independent 50 # Size of a C long int, platform independent
51 int_size = struct.calcsize(b'>i') 51 int_size = struct.calcsize(b'>i')
52 # Size of the entire index format 52 # Size of the entire index format
97 return self._lgt + len(self._extra) 97 return self._lgt + len(self._extra)
98 98
99 def append(self, tup): 99 def append(self, tup):
100 if '_nodemap' in vars(self): 100 if '_nodemap' in vars(self):
101 self._nodemap[tup[7]] = len(self) 101 self._nodemap[tup[7]] = len(self)
102 data = _pack(self.index_format, *tup) 102 data = self.index_format.pack(*tup)
103 self._extra.append(data) 103 self._extra.append(data)
104 104
105 def _check_index(self, i): 105 def _check_index(self, i):
106 if not isinstance(i, int): 106 if not isinstance(i, int):
107 raise TypeError(b"expecting int indexes") 107 raise TypeError(b"expecting int indexes")
115 if i >= self._lgt: 115 if i >= self._lgt:
116 data = self._extra[i - self._lgt] 116 data = self._extra[i - self._lgt]
117 else: 117 else:
118 index = self._calculate_index(i) 118 index = self._calculate_index(i)
119 data = self._data[index : index + self.index_size] 119 data = self._data[index : index + self.index_size]
120 r = _unpack(self.index_format, data) 120 r = self.index_format.unpack(data)
121 if self._lgt and i == 0: 121 if self._lgt and i == 0:
122 r = (offset_type(0, gettype(r[0])),) + r[1:] 122 r = (offset_type(0, gettype(r[0])),) + r[1:]
123 return r 123 return r
124 124
125 125
241 cls = InlinedIndexObject2 if revlogv2 else InlinedIndexObject 241 cls = InlinedIndexObject2 if revlogv2 else InlinedIndexObject
242 return cls(data, inline), (0, data) 242 return cls(data, inline), (0, data)
243 243
244 244
245 class Index2Mixin(object): 245 class Index2Mixin(object):
246 index_format = revlog_constants.INDEX_ENTRY_V2.format 246 index_format = revlog_constants.INDEX_ENTRY_V2
247 index_size = revlog_constants.INDEX_ENTRY_V2.size 247 index_size = revlog_constants.INDEX_ENTRY_V2.size
248 null_item = (0, 0, 0, -1, -1, -1, -1, nullid, 0, 0) 248 null_item = (0, 0, 0, -1, -1, -1, -1, nullid, 0, 0)
249 249
250 def replace_sidedata_info(self, i, sidedata_offset, sidedata_length): 250 def replace_sidedata_info(self, i, sidedata_offset, sidedata_length):
251 """ 251 """