Mercurial > public > mercurial-scm > hg
comparison mercurial/pure/parsers.py @ 47249:130c9f7ed914
revlog: add a "data compression mode" entry in the index tuple
That will make it possible to keep track of compression information in the
revlog index, opening the way to more efficient revision restoration (in native
code, but the python usage is already defeating performance work).
We start with adding a new entry to the index tuple, using a value matching the
current behavior. We will introduce storage and other value in later changesets.
Differential Revision: https://phab.mercurial-scm.org/D10646
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 03 May 2021 18:19:16 +0200 |
parents | 78230d036e5d |
children | 6bfa6c2c5f15 |
comparison
equal
deleted
inserted
replaced
47248:013c645dd28c | 47249:130c9f7ed914 |
---|---|
52 # Size of a C unsigned long long int, platform independent | 52 # Size of a C unsigned long long int, platform independent |
53 big_int_size = struct.calcsize(b'>Q') | 53 big_int_size = struct.calcsize(b'>Q') |
54 # Size of a C long int, platform independent | 54 # Size of a C long int, platform independent |
55 int_size = struct.calcsize(b'>i') | 55 int_size = struct.calcsize(b'>i') |
56 # An empty index entry, used as a default value to be overridden, or nullrev | 56 # An empty index entry, used as a default value to be overridden, or nullrev |
57 null_item = (0, 0, 0, -1, -1, -1, -1, sha1nodeconstants.nullid, 0, 0) | 57 null_item = ( |
58 0, | |
59 0, | |
60 0, | |
61 -1, | |
62 -1, | |
63 -1, | |
64 -1, | |
65 sha1nodeconstants.nullid, | |
66 0, | |
67 0, | |
68 revlog_constants.COMP_MODE_INLINE, | |
69 ) | |
58 | 70 |
59 @util.propertycache | 71 @util.propertycache |
60 def entry_size(self): | 72 def entry_size(self): |
61 return self.index_format.size | 73 return self.index_format.size |
62 | 74 |
133 r = (offset_type(0, gettype(r[0])),) + r[1:] | 145 r = (offset_type(0, gettype(r[0])),) + r[1:] |
134 return r | 146 return r |
135 | 147 |
136 def _unpack_entry(self, data): | 148 def _unpack_entry(self, data): |
137 r = self.index_format.unpack(data) | 149 r = self.index_format.unpack(data) |
138 r = r + (0, 0) | 150 r = r + (0, 0, revlog_constants.COMP_MODE_INLINE) |
139 return r | 151 return r |
140 | 152 |
141 def pack_header(self, header): | 153 def pack_header(self, header): |
142 """pack header information as binary""" | 154 """pack header information as binary""" |
143 v_fmt = revlog_constants.INDEX_HEADER | 155 v_fmt = revlog_constants.INDEX_HEADER |
301 entry = tuple(entry) | 313 entry = tuple(entry) |
302 new = self._pack_entry(entry) | 314 new = self._pack_entry(entry) |
303 self._extra[rev - self._lgt] = new | 315 self._extra[rev - self._lgt] = new |
304 | 316 |
305 def _unpack_entry(self, data): | 317 def _unpack_entry(self, data): |
306 return self.index_format.unpack(data) | 318 return self.index_format.unpack(data) + ( |
319 revlog_constants.COMP_MODE_INLINE, | |
320 ) | |
307 | 321 |
308 def _pack_entry(self, entry): | 322 def _pack_entry(self, entry): |
309 return self.index_format.pack(*entry) | 323 return self.index_format.pack(*entry[:10]) |
310 | 324 |
311 def entry_binary(self, rev): | 325 def entry_binary(self, rev): |
312 """return the raw binary string representing a revision""" | 326 """return the raw binary string representing a revision""" |
313 entry = self[rev] | 327 entry = self[rev] |
314 p = revlog_constants.INDEX_ENTRY_V2.pack(*entry) | 328 return self._pack_entry(entry) |
315 return p | |
316 | 329 |
317 def pack_header(self, header): | 330 def pack_header(self, header): |
318 """pack header information as binary""" | 331 """pack header information as binary""" |
319 msg = 'version header should go in the docket, not the index: %d' | 332 msg = 'version header should go in the docket, not the index: %d' |
320 msg %= header | 333 msg %= header |