Mercurial > public > mercurial-scm > hg
view mercurial/revlogutils/revlogv0.py @ 52049:af54626bf358
dirstate-map: add a missing debug wait point when accessing the v2 docket
fc8e37c380d3 added synchronization points to the dirstate to allow for race
condition testing without actually requiring a time-based race condition
to happen.
This changes adds the `pre-read-file` wait point before we read the docket,
since callers might ask for the parents before anything else is
read, leading to the first read being done before the wait point.
This removes some differences in test output which were presumed to be
speed related, but weren't.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Mon, 14 Oct 2024 14:14:21 +0200 |
parents | 609700e5d8df |
children | 5cc8deb96b48 |
line wrap: on
line source
# revlogv0 - code related to revlog format "V0" # # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com> # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. from __future__ import annotations from ..node import sha1nodeconstants from .constants import ( INDEX_ENTRY_V0, ) from ..i18n import _ from .. import ( error, node, revlogutils, util, ) from . import ( nodemap as nodemaputil, ) def getoffset(q): return int(q >> 16) def gettype(q): return int(q & 0xFFFF) class revlogoldindex(list): rust_ext_compat = 0 entry_size = INDEX_ENTRY_V0.size null_item = revlogutils.entry( data_offset=0, data_compressed_length=0, data_delta_base=node.nullrev, link_rev=node.nullrev, parent_rev_1=node.nullrev, parent_rev_2=node.nullrev, node_id=sha1nodeconstants.nullid, ) @util.propertycache def _nodemap(self): nodemap = nodemaputil.NodeMap({sha1nodeconstants.nullid: node.nullrev}) for r in range(0, len(self)): n = self[r][7] nodemap[n] = r return nodemap def has_node(self, node): """return True if the node exist in the index""" return node in self._nodemap def rev(self, node): """return a revision for a node If the node is unknown, raise a RevlogError""" return self._nodemap[node] def get_rev(self, node): """return a revision for a node If the node is unknown, return None""" return self._nodemap.get(node) def append(self, tup): self._nodemap[tup[7]] = len(self) super(revlogoldindex, self).append(tup) def __delitem__(self, i): if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: raise ValueError(b"deleting slices only supports a:-1 with step 1") for r in range(i.start, len(self)): del self._nodemap[self[r][7]] super(revlogoldindex, self).__delitem__(i) def clearcaches(self): self.__dict__.pop('_nodemap', None) def __getitem__(self, i): if i == -1: return self.null_item return list.__getitem__(self, i) def pack_header(self, header): """pack header information in binary""" return b'' def entry_binary(self, rev): """return the raw binary string representing a revision""" entry = self[rev] if gettype(entry[0]): raise error.RevlogError( _(b'index entry flags need revlog version 1') ) e2 = ( getoffset(entry[0]), entry[1], entry[3], entry[4], self[entry[5]][7], self[entry[6]][7], entry[7], ) return INDEX_ENTRY_V0.pack(*e2) def headrevs(self, excluded_revs=None, stop_rev=None): count = len(self) if stop_rev is not None: count = min(count, stop_rev) if not count: return [node.nullrev] # we won't iter over filtered rev so nobody is a head at start ishead = [0] * (count + 1) revs = range(count) if excluded_revs is not None: revs = (r for r in revs if r not in excluded_revs) for r in revs: ishead[r] = 1 # I may be an head e = self[r] ishead[e[5]] = ishead[e[6]] = 0 # my parent are not return [r for r, val in enumerate(ishead) if val] def parse_index_v0(data, inline): s = INDEX_ENTRY_V0.size index = [] nodemap = nodemaputil.NodeMap({node.nullid: node.nullrev}) n = off = 0 l = len(data) while off + s <= l: cur = data[off : off + s] off += s e = INDEX_ENTRY_V0.unpack(cur) # transform to revlogv1 format e2 = revlogutils.entry( data_offset=e[0], data_compressed_length=e[1], data_delta_base=e[2], link_rev=e[3], parent_rev_1=nodemap.get(e[4], node.nullrev), parent_rev_2=nodemap.get(e[5], node.nullrev), node_id=e[6], ) index.append(e2) nodemap[e[6]] = n n += 1 index = revlogoldindex(index) return index, None