diff mercurial/manifest.py @ 52755:5c48fd4c0e68

typing: introduce a `types` module and a MatcherT alias This is a proposal to formalise the way we do typing and do more of it. The initial motivation to make progress is to help break the 100+ module cycle that is slowing pytype a lot.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 30 Jan 2025 18:22:01 +0100
parents 4cb75772818d
children d7174b43f3e6
line wrap: on
line diff
--- a/mercurial/manifest.py	Tue Feb 04 14:02:20 2025 -0500
+++ b/mercurial/manifest.py	Thu Jan 30 18:22:01 2025 +0100
@@ -28,6 +28,9 @@
 )
 
 from .i18n import _
+from .interfaces.types import (
+    MatcherT,
+)
 from .node import (
     bin,
     hex,
@@ -570,7 +573,7 @@
     def hasdir(self, dir: bytes) -> bool:
         return dir in self._dirs
 
-    def _filesfastpath(self, match: matchmod.basematcher) -> bool:
+    def _filesfastpath(self, match: MatcherT) -> bool:
         """Checks whether we can correctly and quickly iterate over matcher
         files instead of over manifest files."""
         files = match.files()
@@ -579,7 +582,7 @@
             or (match.prefix() and all(fn in self for fn in files))
         )
 
-    def walk(self, match: matchmod.basematcher) -> Iterator[bytes]:
+    def walk(self, match: MatcherT) -> Iterator[bytes]:
         """Generates matching file names.
 
         Equivalent to manifest.matches(match).iterkeys(), but without creating
@@ -615,7 +618,7 @@
             if not self.hasdir(fn):
                 match.bad(fn, None)
 
-    def _matches(self, match: matchmod.basematcher) -> manifestdict:
+    def _matches(self, match: MatcherT) -> manifestdict:
         '''generate a new manifest filtered by the match argument'''
         if match.always():
             return self.copy()
@@ -635,7 +638,7 @@
     def diff(
         self,
         m2: manifestdict,
-        match: Optional[matchmod.basematcher] = None,
+        match: Optional[MatcherT] = None,
         clean: bool = False,
     ) -> Dict[
         bytes,
@@ -1202,7 +1205,7 @@
         return copy
 
     def filesnotin(
-        self, m2: treemanifest, match: Optional[matchmod.basematcher] = None
+        self, m2: treemanifest, match: Optional[MatcherT] = None
     ) -> Set[bytes]:
         '''Set of files in this manifest that are not in the other'''
         if match and not match.always():
@@ -1250,7 +1253,7 @@
         dirslash = dir + b'/'
         return dirslash in self._dirs or dirslash in self._lazydirs
 
-    def walk(self, match: matchmod.basematcher) -> Iterator[bytes]:
+    def walk(self, match: MatcherT) -> Iterator[bytes]:
         """Generates matching file names.
 
         It also reports nonexistent files by marking them bad with match.bad().
@@ -1275,7 +1278,7 @@
             if not self.hasdir(fn):
                 match.bad(fn, None)
 
-    def _walk(self, match: matchmod.basematcher) -> Iterator[bytes]:
+    def _walk(self, match: MatcherT) -> Iterator[bytes]:
         '''Recursively generates matching file names for walk().'''
         visit = match.visitchildrenset(self._dir[:-1])
         if not visit:
@@ -1293,13 +1296,13 @@
                 if not visit or p[:-1] in visit:
                     yield from self._dirs[p]._walk(match)
 
-    def _matches(self, match: matchmod.basematcher) -> treemanifest:
+    def _matches(self, match: MatcherT) -> treemanifest:
         """recursively generate a new manifest filtered by the match argument."""
         if match.always():
             return self.copy()
         return self._matches_inner(match)
 
-    def _matches_inner(self, match: matchmod.basematcher) -> treemanifest:
+    def _matches_inner(self, match: MatcherT) -> treemanifest:
         if match.always():
             return self.copy()
 
@@ -1348,7 +1351,7 @@
     def diff(
         self,
         m2: treemanifest,
-        match: Optional[matchmod.basematcher] = None,
+        match: Optional[MatcherT] = None,
         clean: bool = False,
     ) -> Dict[
         bytes,
@@ -1482,11 +1485,11 @@
                 Callable[[treemanifest], None],
                 bytes,
                 bytes,
-                matchmod.basematcher,
+                MatcherT,
             ],
             None,
         ],
-        match: matchmod.basematcher,
+        match: MatcherT,
     ) -> None:
         self._load()  # for consistency; should never have any effect here
         m1._load()
@@ -1516,7 +1519,7 @@
             writesubtree(subm, subp1, subp2, match)
 
     def walksubtrees(
-        self, matcher: Optional[matchmod.basematcher] = None
+        self, matcher: Optional[MatcherT] = None
     ) -> Iterator[treemanifest]:
         """Returns an iterator of the subtrees of this manifest, including this
         manifest itself.