typing: use a protocol to annotate `pathutil.dirs` in repository.py
That is one external import for the repository interface module. One more to go.
--- a/mercurial/interfaces/misc.py Sat Feb 08 18:12:29 2025 +0100
+++ b/mercurial/interfaces/misc.py Sat Feb 08 18:15:18 2025 +0100
@@ -7,6 +7,7 @@
from typing import (
Callable,
+ Iterator,
List,
Protocol,
)
@@ -24,3 +25,23 @@
@abc.abstractmethod
def __call__(self, *args) -> List:
...
+
+
+class IDirs(Protocol):
+ '''a multiset of directory names from a set of file paths'''
+
+ @abc.abstractmethod
+ def addpath(self, path: bytes) -> None:
+ ...
+
+ @abc.abstractmethod
+ def delpath(self, path: bytes) -> None:
+ ...
+
+ @abc.abstractmethod
+ def __iter__(self) -> Iterator[bytes]:
+ ...
+
+ @abc.abstractmethod
+ def __contains__(self, d: bytes) -> bool:
+ ...
--- a/mercurial/interfaces/repository.py Sat Feb 08 18:12:29 2025 +0100
+++ b/mercurial/interfaces/repository.py Sat Feb 08 18:15:18 2025 +0100
@@ -31,9 +31,6 @@
# Almost all mercurial modules are only imported in the type checking phase
# to avoid circular imports
- from .. import (
- pathutil,
- )
from ..utils import (
urlutil,
)
@@ -1178,7 +1175,7 @@
"""
@abc.abstractmethod
- def dirs(self) -> pathutil.dirs:
+ def dirs(self) -> misc.IDirs:
"""Returns an object implementing the ``idirs`` interface."""
@abc.abstractmethod
--- a/mercurial/pathutil.py Sat Feb 08 18:12:29 2025 +0100
+++ b/mercurial/pathutil.py Sat Feb 08 18:15:18 2025 +0100
@@ -22,6 +22,8 @@
util,
)
+from .interfaces import misc as int_misc
+
rustdirs = policy.importrust('dirstate', 'Dirs', pyo3=True)
parsers = policy.importmod('parsers')
@@ -335,7 +337,7 @@
pos = path.find(pycompat.ossep, pos + 1)
-class dirs:
+class dirs(int_misc.IDirs):
'''a multiset of directory names from a set of file paths'''
def __init__(self, map, only_tracked=False):