Mercurial > public > mercurial-scm > hg
comparison mercurial/pure/bdiff.py @ 49598:594fc56c0af7
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.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Tue, 08 Nov 2022 13:59:16 -0500 |
parents | 6000f5b25c9b |
children | f4733654f144 |
comparison
equal
deleted
inserted
replaced
49597:b2666e767029 | 49598:594fc56c0af7 |
---|---|
8 | 8 |
9 import difflib | 9 import difflib |
10 import re | 10 import re |
11 import struct | 11 import struct |
12 | 12 |
13 from typing import ( | |
14 List, | |
15 Tuple, | |
16 ) | |
13 | 17 |
14 def splitnewlines(text): | 18 |
19 def splitnewlines(text: bytes) -> List[bytes]: | |
15 '''like str.splitlines, but only split on newlines.''' | 20 '''like str.splitlines, but only split on newlines.''' |
16 lines = [l + b'\n' for l in text.split(b'\n')] | 21 lines = [l + b'\n' for l in text.split(b'\n')] |
17 if lines: | 22 if lines: |
18 if lines[-1] == b'\n': | 23 if lines[-1] == b'\n': |
19 lines.pop() | 24 lines.pop() |
20 else: | 25 else: |
21 lines[-1] = lines[-1][:-1] | 26 lines[-1] = lines[-1][:-1] |
22 return lines | 27 return lines |
23 | 28 |
24 | 29 |
25 def _normalizeblocks(a, b, blocks): | 30 def _normalizeblocks( |
31 a: List[bytes], b: List[bytes], blocks | |
32 ) -> List[Tuple[int, int, int]]: | |
26 prev = None | 33 prev = None |
27 r = [] | 34 r = [] |
28 for curr in blocks: | 35 for curr in blocks: |
29 if prev is None: | 36 if prev is None: |
30 prev = curr | 37 prev = curr |
55 r.append(prev) | 62 r.append(prev) |
56 | 63 |
57 return r | 64 return r |
58 | 65 |
59 | 66 |
60 def bdiff(a, b): | 67 def bdiff(a: bytes, b: bytes) -> bytes: |
61 a = bytes(a).splitlines(True) | 68 a = bytes(a).splitlines(True) |
62 b = bytes(b).splitlines(True) | 69 b = bytes(b).splitlines(True) |
63 | 70 |
64 if not a: | 71 if not a: |
65 s = b"".join(b) | 72 s = b"".join(b) |
82 lb = bm + size | 89 lb = bm + size |
83 | 90 |
84 return b"".join(bin) | 91 return b"".join(bin) |
85 | 92 |
86 | 93 |
87 def blocks(a, b): | 94 def blocks(a: bytes, b: bytes) -> List[Tuple[int, int, int, int]]: |
88 an = splitnewlines(a) | 95 an = splitnewlines(a) |
89 bn = splitnewlines(b) | 96 bn = splitnewlines(b) |
90 d = difflib.SequenceMatcher(None, an, bn).get_matching_blocks() | 97 d = difflib.SequenceMatcher(None, an, bn).get_matching_blocks() |
91 d = _normalizeblocks(an, bn, d) | 98 d = _normalizeblocks(an, bn, d) |
92 return [(i, i + n, j, j + n) for (i, j, n) in d] | 99 return [(i, i + n, j, j + n) for (i, j, n) in d] |
93 | 100 |
94 | 101 |
95 def fixws(text, allws): | 102 def fixws(text: bytes, allws: bool) -> bytes: |
96 if allws: | 103 if allws: |
97 text = re.sub(b'[ \t\r]+', b'', text) | 104 text = re.sub(b'[ \t\r]+', b'', text) |
98 else: | 105 else: |
99 text = re.sub(b'[ \t\r]+', b' ', text) | 106 text = re.sub(b'[ \t\r]+', b' ', text) |
100 text = text.replace(b' \n', b'\n') | 107 text = text.replace(b' \n', b'\n') |