Skip to content
Snippets Groups Projects
Commit 8de9bab8 authored by Matt Harbison's avatar Matt Harbison
Browse files

pure: add an "abstractmethod" and some type hints to parsers.py to help pytype

It looks like `BaseIndexObject` is meant to be a base class with common
implementation across the subclasses.  Both subclasses provide the class attrs
typed here, as well as `_calculate_index()` that are accessed by the base class.
The trick is, `revlog.RustIndexProxy` also uses it as a base class, and forwards
some methods such that it doesn't want or need this method.  This is kind of a
workaround to keep everything happy.

Likewise, it doesn't need the 3 class variables, because it overrides the
methods in this class that use them.  But there's no way to conditionally
declare these.  Their presence seems conditional on the version of Python- see
199b0e62b403.  (Also, it looks like the rust class doesn't override `append()`,
which would need `_extra`.  Not sure if this is an oversight, or if it's more of
a "protected" field instead of private.)

`PersistentNodeMapIndexObject` says it's for debugging, so I'm not going to
bother trying to figure out what the 3 required class attr types are right now,
and risk introducing a cycle that confuses pytype.
parent 1b9b6b4a
No related branches found
No related tags found
2 merge requests!1292Draft: 7.0rc preparation,!1176Include mercurial.pure.parsers in type checking
......@@ -34,6 +34,12 @@
from ..revlogutils import nodemap as nodemaputil
from ..revlogutils import constants as revlog_constants
if typing.TYPE_CHECKING:
from typing import (
Any,
ByteString, # TODO: Change to Buffer for 3.14+ support
)
stringio = io.BytesIO
......@@ -600,6 +606,11 @@
revlog_constants.RANK_UNKNOWN,
)
# These aren't needed for rust
_data: ByteString
_extra: list[bytes]
_lgt: int
@util.propertycache
def entry_size(self):
return self.index_format.size
......@@ -657,6 +668,12 @@
if i < 0 or i >= len(self):
raise IndexError(i)
def _calculate_index(self, i: int) -> int:
# This isn't @abstractmethod because it is only used in __getitem__().
# The revlog.RustIndexProxy implementation provides its own, so there's
# no reason to force it to implement an unused method.
raise NotImplementedError
def __getitem__(self, i):
if i == -1:
return self.null_item
......@@ -729,7 +746,7 @@
self._lgt = len(data) // self.entry_size
self._extra = []
def _calculate_index(self, i):
def _calculate_index(self, i: int) -> int:
return i * self.entry_size
def __delitem__(self, i):
......@@ -754,6 +771,11 @@
through the dedicated `devel.persistent-nodemap` config.
"""
# TODO: add type info
_nm_docket: Any # TODO: could be None, but need to handle .tip_rev below
_nm_max_idx: Any | None
_nm_root: Any | None
def nodemap_data_all(self):
"""Return bytes containing a full serialization of a nodemap
......@@ -829,7 +851,7 @@
else:
self._extra = self._extra[: i - self._lgt]
def _calculate_index(self, i):
def _calculate_index(self, i: int) -> int:
return self._offsets[i]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment