# HG changeset patch # User Matt Harbison # Date 2024-12-07 06:57:55 # Node ID 2c8c46c3c401d51cb7821f19a6425e91dcb7c076 # Parent 31c4987034b9a186552d0d2407def355220b7ae9 interfaces: mark a few dirstate methods abstract I'm not sure what's going on here, but when enabling pytype checking on this package, it spits out the following errors: File "/mnt/c/Users/Matt/hg/mercurial/interfaces/dirstate.py", line 136, in changing_parents: bad return type [bad-return-type] Expected: Iterator Actually returned: None Attributes of protocol Iterator are not implemented on None: __next__ File "/mnt/c/Users/Matt/hg/mercurial/interfaces/dirstate.py", line 145, in changing_files: bad return type [bad-return-type] Expected: Iterator Actually returned: None Attributes of protocol Iterator are not implemented on None: __next__ I guess technically that's true, because these methods only have a doc comment, and don't explicitly return something or unconditionally raise an error. The strange thing is that both before and after this change, the *.pyi file that is generated is unchanged, and contains: def changing_files(self, repo) -> contextlib._GeneratorContextManager: ... def changing_parents(self, repo) -> contextlib._GeneratorContextManager: ... I'm not sure if the `@abstractmethod` should be the most inner or most outer decoration. We'll roll the dice with being the innermost, because that's how `@abstractproperty` says it should be used in conjunction with `@property`. We should probably make all of the methods without an actual body abstract, like was done for some `mercurial.wireprototypes` classes in fd200f5bcaea. But let's hold off for now and do that enmass later. diff --git a/mercurial/interfaces/dirstate.py b/mercurial/interfaces/dirstate.py --- a/mercurial/interfaces/dirstate.py +++ b/mercurial/interfaces/dirstate.py @@ -1,5 +1,6 @@ from __future__ import annotations +import abc import contextlib import os import typing @@ -127,6 +128,7 @@ class idirstate(Protocol): """Callable for checking exec bits.""" # TODO: this comment looks stale @contextlib.contextmanager + @abc.abstractmethod def changing_parents(self, repo) -> Iterator: # TODO: typehint this """Context manager for handling dirstate parents. @@ -136,6 +138,7 @@ class idirstate(Protocol): """ @contextlib.contextmanager + @abc.abstractmethod def changing_files(self, repo) -> Iterator: # TODO: typehint this """Context manager for handling dirstate files.