Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 46856:34e1fa4b548a
revlog: move the details of revlog "v0" index inside revlog.utils.constants
the revlog module is quite large and this kind of format information would handy
for other module. So let us start to gather this information about the format in
a more appropriate place.
Differential Revision: https://phab.mercurial-scm.org/D10303
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 05 Apr 2021 12:20:52 +0200 |
parents | fbfb1d6d8459 |
children | cc65cea90edb |
comparison
equal
deleted
inserted
replaced
46855:aba724bf550e | 46856:34e1fa4b548a |
---|---|
39 from .i18n import _ | 39 from .i18n import _ |
40 from .pycompat import getattr | 40 from .pycompat import getattr |
41 from .revlogutils.constants import ( | 41 from .revlogutils.constants import ( |
42 FLAG_GENERALDELTA, | 42 FLAG_GENERALDELTA, |
43 FLAG_INLINE_DATA, | 43 FLAG_INLINE_DATA, |
44 INDEX_ENTRY_V0, | |
44 REVLOGV0, | 45 REVLOGV0, |
45 REVLOGV1, | 46 REVLOGV1, |
46 REVLOGV1_FLAGS, | 47 REVLOGV1_FLAGS, |
47 REVLOGV2, | 48 REVLOGV2, |
48 REVLOGV2_FLAGS, | 49 REVLOGV2_FLAGS, |
216 warning = attr.ib(default=None) | 217 warning = attr.ib(default=None) |
217 error = attr.ib(default=None) | 218 error = attr.ib(default=None) |
218 node = attr.ib(default=None) | 219 node = attr.ib(default=None) |
219 | 220 |
220 | 221 |
221 # index v0: | |
222 # 4 bytes: offset | |
223 # 4 bytes: compressed length | |
224 # 4 bytes: base rev | |
225 # 4 bytes: link rev | |
226 # 20 bytes: parent 1 nodeid | |
227 # 20 bytes: parent 2 nodeid | |
228 # 20 bytes: nodeid | |
229 indexformatv0 = struct.Struct(b">4l20s20s20s") | |
230 indexformatv0_pack = indexformatv0.pack | |
231 indexformatv0_unpack = indexformatv0.unpack | |
232 | |
233 | |
234 class revlogoldindex(list): | 222 class revlogoldindex(list): |
235 @property | 223 @property |
236 def nodemap(self): | 224 def nodemap(self): |
237 msg = b"index.nodemap is deprecated, use index.[has_node|rev|get_rev]" | 225 msg = b"index.nodemap is deprecated, use index.[has_node|rev|get_rev]" |
238 util.nouideprecwarn(msg, b'5.3', stacklevel=2) | 226 util.nouideprecwarn(msg, b'5.3', stacklevel=2) |
282 return list.__getitem__(self, i) | 270 return list.__getitem__(self, i) |
283 | 271 |
284 | 272 |
285 class revlogoldio(object): | 273 class revlogoldio(object): |
286 def __init__(self): | 274 def __init__(self): |
287 self.size = indexformatv0.size | 275 self.size = INDEX_ENTRY_V0.size |
288 | 276 |
289 def parseindex(self, data, inline): | 277 def parseindex(self, data, inline): |
290 s = self.size | 278 s = self.size |
291 index = [] | 279 index = [] |
292 nodemap = nodemaputil.NodeMap({nullid: nullrev}) | 280 nodemap = nodemaputil.NodeMap({nullid: nullrev}) |
293 n = off = 0 | 281 n = off = 0 |
294 l = len(data) | 282 l = len(data) |
295 while off + s <= l: | 283 while off + s <= l: |
296 cur = data[off : off + s] | 284 cur = data[off : off + s] |
297 off += s | 285 off += s |
298 e = indexformatv0_unpack(cur) | 286 e = INDEX_ENTRY_V0.unpack(cur) |
299 # transform to revlogv1 format | 287 # transform to revlogv1 format |
300 e2 = ( | 288 e2 = ( |
301 offset_type(e[0], 0), | 289 offset_type(e[0], 0), |
302 e[1], | 290 e[1], |
303 -1, | 291 -1, |
313 | 301 |
314 index = revlogoldindex(index) | 302 index = revlogoldindex(index) |
315 return index, None | 303 return index, None |
316 | 304 |
317 def packentry(self, entry, node, version, rev): | 305 def packentry(self, entry, node, version, rev): |
306 """return the binary representation of an entry | |
307 | |
308 entry: a tuple containing all the values (see index.__getitem__) | |
309 node: a callback to convert a revision to nodeid | |
310 version: the changelog version | |
311 rev: the revision number | |
312 """ | |
318 if gettype(entry[0]): | 313 if gettype(entry[0]): |
319 raise error.RevlogError( | 314 raise error.RevlogError( |
320 _(b'index entry flags need revlog version 1') | 315 _(b'index entry flags need revlog version 1') |
321 ) | 316 ) |
322 e2 = ( | 317 e2 = ( |
326 entry[4], | 321 entry[4], |
327 node(entry[5]), | 322 node(entry[5]), |
328 node(entry[6]), | 323 node(entry[6]), |
329 entry[7], | 324 entry[7], |
330 ) | 325 ) |
331 return indexformatv0_pack(*e2) | 326 return INDEX_ENTRY_V0.pack(*e2) |
332 | 327 |
333 | 328 |
334 # index ng: | 329 # index ng: |
335 # 6 bytes: offset | 330 # 6 bytes: offset |
336 # 2 bytes: flags | 331 # 2 bytes: flags |