D9281: cext: add .pyi files for C extensions

indygreg (Gregory Szorc) phabricator at mercurial-scm.org
Sun Nov 8 01:23:30 UTC 2020


indygreg created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  I'm unsure if all the annotations are completely accurate. But having
  these helps type checkers reason about our C extensions.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D9281

AFFECTED FILES
  mercurial/cext/base85.pyi
  mercurial/cext/bdiff.pyi
  mercurial/cext/mpatch.pyi
  mercurial/cext/osutil.pyi
  mercurial/cext/parsers.pyi

CHANGE DETAILS

diff --git a/mercurial/cext/parsers.pyi b/mercurial/cext/parsers.pyi
new file mode 100644
--- /dev/null
+++ b/mercurial/cext/parsers.pyi
@@ -0,0 +1,78 @@
+from typing import (
+    Callable,
+    Dict,
+    Iterator,
+    List,
+    Optional,
+    Set,
+    Tuple,
+    Union,
+)
+
+version: int
+versionerrortext: str
+
+class dirstatetuple:
+    __doc__: str
+
+    def __len__(self) -> int: ...
+    def __getitem__(self, key: int) -> Union[bytes, int]: ...
+
+# From dirs.c
+
+class dirs:
+    __doc__: str
+    def __init__(self, source, skipchar: bytes): ...
+    def __iter__(self) -> Iterator[bytes]: ...
+    def addpath(self, path: bytes) -> None: ...
+    def delpath(self, path: bytes) -> None: ...
+
+# From manifest.c
+class lazymanifest:
+    def __init__(self, data: bytes): ...
+    def __iter__(self) -> Iterator[bytes]: ...
+
+    def __len__(self) -> int: ...
+    def __getitem__(self, item: bytes) -> Optional[Tuple[bytes, bytes]]: ...
+    def __setitem__(self, key: bytes, value: Tuple[bytes, bytes]) -> None: ...
+    def __delitem__(self, key: bytes) -> None: ...
+
+    def iterkeys(self) -> Iterator[bytes]: ...
+    def iterentries(self) -> Iterator[Tuple[bytes, bytes, bytes]]: ...
+    def copy(self) -> lazymanifest: ...
+    def filtercopy(self, matchfn: Callable[[bytes], bool]) -> lazymanifest: ...
+    def diff(self, other: lazymanifest, clean: Optional[bool]) -> Dict[bytes, Tuple[bytes, Tuple]]: ...
+    def text(self) -> bytes: ...
+
+# From revlog.c
+
+class index:
+    __doc__: str
+
+    nodemap: Dict[bytes, int]
+
+    def ancestors(self, *args: int) -> Iterator[int]: ...
+    def commonancestorsheads(self, *args: int) -> List[int]: ...
+    def clearcaches(self) -> None: ...
+    def get(self, value: bytes) -> Optional[int]: ...
+    def get_rev(self, value: bytes) -> Optional[int]: ...
+    def has_node(self, value: Union[int, bytes]) -> bool: ...
+    def rev(self, node: bytes) -> int: ...
+    def computephasesmapsets(self, root: Dict[int, Set[bytes]]) -> Tuple[int, Dict[int, Set[bytes]]]: ...
+    def reachableroots2(self, minroot: int, heads: List[int], roots: List[int], includepath: bool) -> List[int]: ...
+    def headrevs(self, filteredrevs: Optional[List[int]]) -> List[int]: ...
+    def headrevsfiltered(self, filteredrevs: Optional[List[int]]) -> List[int]: ...
+    def issnapshot(self, value: int) -> bool: ...
+    def findsnapshots(self, cache: Dict[int, List[int]], start_rev: int) -> None: ...
+    def deltachain(self, rev: int, stop: int, generaldelta: bool) -> Tuple[List[int], bool]: ...
+    def slicechunktodensity(self, revs: List[int], targetdensity: float, mingapsize: int) -> List[List[int]]: ...
+    def append(self, value: Tuple[int, int, int, int, int, int, int, bytes]) -> None: ...
+    def partialmatch(self, node: bytes) -> bytes: ...
+    def shortest(self, value: bytes) -> int: ...
+    def stats(self) -> Dict[bytes, int]: ...
+
+class nodetree:
+    __doc__: str
+
+    def insert(self, rev: int) -> None: ...
+    def shortest(self, node: bytes) -> int: ...
diff --git a/mercurial/cext/osutil.pyi b/mercurial/cext/osutil.pyi
new file mode 100644
--- /dev/null
+++ b/mercurial/cext/osutil.pyi
@@ -0,0 +1,26 @@
+from typing import (
+    AnyStr,
+    IO,
+    List,
+    Sequence,
+)
+
+version: int
+
+class stat:
+    st_dev: int
+    st_mode: int
+    st_nlink: int
+    st_size: int
+    st_mtime: int
+    st_ctime: int
+
+def listdir(path: bytes, st: stat, skip: bool) -> List[stat]: ...
+def posixfile(name: AnyStr, mode: bytes, buffering: int) -> IO: ...
+def statfiles(names: Sequence[bytes]) -> List[stat]: ...
+def recvfds(sockfd: int) -> List[int]: ...
+def setprocname(name: bytes) -> None: ...
+def getfstype(path: bytes) -> bytes: ...
+def getfsmountpoint(path: bytes) -> bytes: ...
+def unblocksignal(sig: int) -> None: ...
+def isgui() -> bool: ...
diff --git a/mercurial/cext/mpatch.pyi b/mercurial/cext/mpatch.pyi
new file mode 100644
--- /dev/null
+++ b/mercurial/cext/mpatch.pyi
@@ -0,0 +1,10 @@
+from typing import (
+    List,
+)
+
+version: int
+
+class mpatchError(Exception): ...
+
+def patches(text: bytes, bins: List[bytes]) -> bytes: ...
+def patchedsize(orig: int, data: bytes) -> int: ...
diff --git a/mercurial/cext/bdiff.pyi b/mercurial/cext/bdiff.pyi
new file mode 100644
--- /dev/null
+++ b/mercurial/cext/bdiff.pyi
@@ -0,0 +1,12 @@
+from typing import (
+    List,
+    Tuple,
+)
+
+version: int
+
+def bdiff(a: bytes, b: bytes): bytes
+def blocks(a: bytes, b: bytes) -> List[Tuple[int, int, int, int]]: ...
+def fixws(s: bytes, allws: bool) -> bytes: ...
+def splitnewlines(text: bytes) -> List[bytes]: ...
+def xdiffblocks(a: bytes, b: bytes) -> List[Tuple[int, int, int, int]]: ...
diff --git a/mercurial/cext/base85.pyi b/mercurial/cext/base85.pyi
new file mode 100644
--- /dev/null
+++ b/mercurial/cext/base85.pyi
@@ -0,0 +1,6 @@
+from typing import Optional
+
+version: int
+
+def b85encode(text: bytes, pad: Optional[int]) -> bytes: ...
+def b85decode(text: bytes) -> bytes: ...



To: indygreg, #hg-reviewers
Cc: mercurial-patches, mercurial-devel


More information about the Mercurial-devel mailing list