##// END OF EJS Templates
interfaces: convert the repository zope interfaces to Protocol classes...
interfaces: convert the repository zope interfaces to Protocol classes This is the same transformation as 382d9629cede did for dirstate. The same caveat applies- the code may not be valid, since the functions are missing the `self` arg, and the attrs should be plain attrs, not zope `Attribute`. These classes are pretty intertwined however, so making the same transformation to everything makes it easier to change and review. Additionally, there are some classes that subclass multiple protocol classes, and should themselves subclass `typing.Protocol` to be a protocol class. But defer that for now for clarity.

File last commit:

r52872:609700e5 default
r53342:26dd402c default
Show More
revlogv0.py
158 lines | 4.2 KiB | text/x-python | PythonLexer
revlog: code for `revlogv0` in its own module...
r47812 # 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.
Matt Harbison
typing: add `from __future__ import annotations` to most files...
r52756 from __future__ import annotations
revlog: code for `revlogv0` in its own module...
r47812
from ..node import sha1nodeconstants
from .constants import (
INDEX_ENTRY_V0,
)
from ..i18n import _
from .. import (
error,
node,
revlog: move `offset_type` to `revlogutils`...
r48186 revlogutils,
revlog: code for `revlogv0` in its own module...
r47812 util,
)
from . import (
nodemap as nodemaputil,
)
def getoffset(q):
return int(q >> 16)
def gettype(q):
return int(q & 0xFFFF)
class revlogoldindex(list):
revlog: signal which revlog index are compatible with Rust...
r48042 rust_ext_compat = 0
revlog: code for `revlogv0` in its own module...
r47812 entry_size = INDEX_ENTRY_V0.size
revlog: use entry in revlogv0.py...
r48189 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,
revlog: add a "data compression mode" entry in the index tuple...
r48023 )
revlog: code for `revlogv0` in its own module...
r47812
@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")
Manuel Jacob
py3: replace `pycompat.xrange` by `range`
r50179 for r in range(i.start, len(self)):
revlog: code for `revlogv0` in its own module...
r47812 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:
revlog: create a create `null_item` attribute for V0...
r48021 return self.null_item
revlog: code for `revlogv0` in its own module...
r47812 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)
head-revs: add a native implementation of the `stop_rev` parameter...
r52872 def headrevs(self, excluded_revs=None, stop_rev=None):
head-revs: teach the pure indexes about the `headrevs` method...
r52862 count = len(self)
head-revs: add a native implementation of the `stop_rev` parameter...
r52872 if stop_rev is not None:
count = min(count, stop_rev)
head-revs: teach the pure indexes about the `headrevs` method...
r52862 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]
revlog: code for `revlogv0` in its own module...
r47812
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
revlog: use entry in revlogv0.py...
r48189 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],
revlog: code for `revlogv0` in its own module...
r47812 )
index.append(e2)
nodemap[e[6]] = n
n += 1
index = revlogoldindex(index)
return index, None