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