typing: add type hints to bdiff implementations
Not super important code, but this was an exercise in using `merge-pyi` to fold
type stubs back into the code on something small. The cext stubs don't seem to
be getting used (at least the only thing in `.pytype/pyi/mercurial/cext` after a
run generating the stubs is `__init__.pyi`), so maybe this will help some.
--- a/mercurial/cffi/bdiff.py Tue Nov 08 13:52:46 2022 -0500
+++ b/mercurial/cffi/bdiff.py Tue Nov 08 13:59:16 2022 -0500
@@ -8,6 +8,11 @@
import struct
+from typing import (
+ List,
+ Tuple,
+)
+
from ..pure.bdiff import *
from . import _bdiff # pytype: disable=import-error
@@ -15,7 +20,7 @@
lib = _bdiff.lib
-def blocks(sa, sb):
+def blocks(sa: bytes, sb: bytes) -> List[Tuple[int, int, int, int]]:
a = ffi.new(b"struct bdiff_line**")
b = ffi.new(b"struct bdiff_line**")
ac = ffi.new(b"char[]", str(sa))
@@ -43,7 +48,7 @@
return rl
-def bdiff(sa, sb):
+def bdiff(sa: bytes, sb: bytes) -> bytes:
a = ffi.new(b"struct bdiff_line**")
b = ffi.new(b"struct bdiff_line**")
ac = ffi.new(b"char[]", str(sa))
--- a/mercurial/pure/bdiff.py Tue Nov 08 13:52:46 2022 -0500
+++ b/mercurial/pure/bdiff.py Tue Nov 08 13:59:16 2022 -0500
@@ -10,8 +10,13 @@
import re
import struct
+from typing import (
+ List,
+ Tuple,
+)
-def splitnewlines(text):
+
+def splitnewlines(text: bytes) -> List[bytes]:
'''like str.splitlines, but only split on newlines.'''
lines = [l + b'\n' for l in text.split(b'\n')]
if lines:
@@ -22,7 +27,9 @@
return lines
-def _normalizeblocks(a, b, blocks):
+def _normalizeblocks(
+ a: List[bytes], b: List[bytes], blocks
+) -> List[Tuple[int, int, int]]:
prev = None
r = []
for curr in blocks:
@@ -57,7 +64,7 @@
return r
-def bdiff(a, b):
+def bdiff(a: bytes, b: bytes) -> bytes:
a = bytes(a).splitlines(True)
b = bytes(b).splitlines(True)
@@ -84,7 +91,7 @@
return b"".join(bin)
-def blocks(a, b):
+def blocks(a: bytes, b: bytes) -> List[Tuple[int, int, int, int]]:
an = splitnewlines(a)
bn = splitnewlines(b)
d = difflib.SequenceMatcher(None, an, bn).get_matching_blocks()
@@ -92,7 +99,7 @@
return [(i, i + n, j, j + n) for (i, j, n) in d]
-def fixws(text, allws):
+def fixws(text: bytes, allws: bool) -> bytes:
if allws:
text = re.sub(b'[ \t\r]+', b'', text)
else: