mercurial/revlog.py
changeset 46856 34e1fa4b548a
parent 46852 fbfb1d6d8459
child 46857 cc65cea90edb
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