Mercurial > public > mercurial-scm > hg
changeset 52474:048c11993d6a
typing: (mostly) align the signatures of `imanifestrevisionstored` overrides
When we change the implementations to subclass this explicitly, pytype complains
that the signatures mismatch for various methods. It seems hung up on ones in
`mercurial.manifest` that have type hints on the return value, but lacked it in
the Protocol class (which it thinks returns `None` if there's no annotation).
The tricky part is that a lot of the return types in the `mercurial.manifest`
module are custom types specific to that module (e.g. `'manifestctx' | 'treemanifestctx'`).
Those should probably be replaced with Protocol classes.
I was going to avoid making a long series longer by disabling that check for now
by putting `Any` as the return type on the Protocol class methods, and then
realized the problem is the class isn't marked as a Protocol (that property isn't
inherited). For now, lock in the synchronized signatures.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Wed, 23 Oct 2024 12:44:09 -0400 |
parents | a1dd484bf33b |
children | cdd4bc69bfc1 |
files | hgext/git/manifest.py mercurial/interfaces/repository.py mercurial/manifest.py |
diffstat | 3 files changed, 18 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/git/manifest.py Tue Oct 22 22:28:10 2024 -0400 +++ b/hgext/git/manifest.py Wed Oct 23 12:44:09 2024 -0400 @@ -268,7 +268,7 @@ def read(self): return gittreemanifest(self._repo, self._tree, None) - def readfast(self, shallow=False): + def readfast(self, shallow: bool = False): return self.read() def copy(self): @@ -276,7 +276,7 @@ # because the caller expects a mutable manifest. return memgittreemanifestctx(self._repo, self._tree) - def find(self, path): + def find(self, path: bytes) -> tuple[bytes, bytes]: return self.read()[path]
--- a/mercurial/interfaces/repository.py Tue Oct 22 22:28:10 2024 -0400 +++ b/mercurial/interfaces/repository.py Wed Oct 23 12:44:09 2024 -0400 @@ -12,6 +12,7 @@ from typing import ( Any, + Collection, Protocol, ) @@ -1173,13 +1174,13 @@ class imanifestrevisionstored(imanifestrevisionbase): """Interface representing a manifest revision committed to storage.""" - def node(self): + def node(self) -> bytes: """The binary node for this manifest.""" parents: list[bytes] """List of binary nodes that are parents for this manifest revision.""" - def readdelta(self, shallow=False): + def readdelta(self, shallow: bool = False): """Obtain the manifest data structure representing changes from parent. This manifest is compared to its 1st parent. A new manifest @@ -1194,7 +1195,12 @@ The returned object conforms to the ``imanifestdict`` interface. """ - def read_any_fast_delta(self, valid_bases=None, *, shallow=False): + def read_any_fast_delta( + self, + valid_bases: Collection[int] | None = None, + *, + shallow: bool = False, + ): """read some manifest information as fast if possible This might return a "delta", a manifest object containing only file @@ -1217,7 +1223,7 @@ The returned object conforms to the ``imanifestdict`` interface. """ - def read_delta_parents(self, *, shallow=False, exact=True): + def read_delta_parents(self, *, shallow: bool = False, exact: bool = True): """return a diff from this revision against both parents. If `exact` is False, this might return a superset of the diff, containing @@ -1231,7 +1237,7 @@ The returned object conforms to the ``imanifestdict`` interface.""" - def read_delta_new_entries(self, *, shallow=False): + def read_delta_new_entries(self, *, shallow: bool = False): """Return a manifest containing just the entries that might be new to the repository. @@ -1246,13 +1252,13 @@ The returned object conforms to the ``imanifestdict`` interface.""" - def readfast(self, shallow=False): + def readfast(self, shallow: bool = False): """Calls either ``read()`` or ``readdelta()``. The faster of the two options is called. """ - def find(self, key): + def find(self, key: bytes) -> tuple[bytes, bytes]: """Calls self.read().find(key)``. Returns a 2-tuple of ``(node, flags)`` or raises ``KeyError``.
--- a/mercurial/manifest.py Tue Oct 22 22:28:10 2024 -0400 +++ b/mercurial/manifest.py Wed Oct 23 12:44:09 2024 -0400 @@ -2332,7 +2332,7 @@ md.set(f, new_node, new_flag) return md - def read_delta_new_entries(self, *, shallow=False) -> manifestdict: + def read_delta_new_entries(self, *, shallow: bool = False) -> manifestdict: """see `interface.imanifestrevisionbase` documentations""" # If we are using narrow, returning a delta against an arbitrary # changeset might return file outside the narrowspec. This can create @@ -2621,7 +2621,7 @@ bases = (store.deltaparent(r),) return self.read_any_fast_delta(bases, shallow=shallow)[1] - def readfast(self, shallow=False) -> AnyManifestDict: + def readfast(self, shallow: bool = False) -> AnyManifestDict: """Calls either readdelta or read, based on which would be less work. readdelta is called if the delta is against the p1, and therefore can be read quickly. @@ -2694,7 +2694,7 @@ def read(self): return excludeddir(self.nodeconstants, self._dir, self._node) - def readfast(self, shallow=False): + def readfast(self, shallow: bool = False): # special version of readfast since we don't have underlying storage return self.read()