##// END OF EJS Templates
typing: add type annotations to the dirstate classes...
typing: add type annotations to the dirstate classes The basic procedure here was to use `merge-pyi` to merge the `git/dirstate.pyi` file in (after renaming the interface class to match), cleaning up the import statement mess, and then repeating the procedure for `mercurial/dirstate.pyi`. Surprisingly, git's dirstate had more hints inferred in its *.pyi file. After that, it was a manual examination of each method in the interface, and how they were implemented in the core and git classes to verify what was inferred by pytype, and fill in the missing gaps. Since this involved jumping around between three different files, I applied the same type info to all three at the same time. Complex types I rolled up into type aliases in the interface module, and used that as needed. That way if it changes, there's one place to edit. There are some hints still missing, and some documentation that doesn't match the signatures. They should all be marked with TODOs. There are also a bunch of methods on the core class that aren't on the Protocol class that seem like maybe they should be (like `set_tracked()`). There are even more methods missing from the git class. But that's a project for another time.

File last commit:

r52756:f4733654 default
r52822:93d872a0 default
Show More
bdiff.py
109 lines | 2.6 KiB | text/x-python | PythonLexer
Martin Geisler
pure Python implementation of bdiff.c
r7703 # bdiff.py - Python implementation of bdiff.c
#
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2009 Olivia Mackall <olivia@selenic.com> and others
Martin Geisler
pure Python implementation of bdiff.c
r7703 #
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Martin Geisler
pure Python implementation of bdiff.c
r7703
Matt Harbison
typing: add `from __future__ import annotations` to most files...
r52756 from __future__ import annotations
Gregory Szorc
bdiff: use absolute_import
r27335
import difflib
import re
import struct
Matt Mackall
pure/bdiff: fix circular import
r7944
Matt Harbison
typing: add type hints to bdiff implementations...
r50493 from typing import (
List,
Tuple,
)
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
typing: add type hints to bdiff implementations...
r50493
def splitnewlines(text: bytes) -> List[bytes]:
Matt Mackall
pure/bdiff: fix circular import
r7944 '''like str.splitlines, but only split on newlines.'''
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lines = [l + b'\n' for l in text.split(b'\n')]
Matt Mackall
pure/bdiff: fix circular import
r7944 if lines:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if lines[-1] == b'\n':
Matt Mackall
pure/bdiff: fix circular import
r7944 lines.pop()
else:
lines[-1] = lines[-1][:-1]
return lines
Martin Geisler
pure Python implementation of bdiff.c
r7703
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
typing: add type hints to bdiff implementations...
r50493 def _normalizeblocks(
a: List[bytes], b: List[bytes], blocks
) -> List[Tuple[int, int, int]]:
Martin Geisler
pure Python implementation of bdiff.c
r7703 prev = None
Dan Villiom Podlaski Christiansen
pure bdiff: don't use a generator...
r14066 r = []
Martin Geisler
pure Python implementation of bdiff.c
r7703 for curr in blocks:
if prev is None:
prev = curr
continue
shift = 0
a1, b1, l1 = prev
a1end = a1 + l1
b1end = b1 + l1
a2, b2, l2 = curr
a2end = a2 + l2
b2end = b2 + l2
if a1end == a2:
Augie Fackler
formatting: blacken the codebase...
r43346 while (
a1end + shift < a2end and a[a1end + shift] == b[b1end + shift]
):
Martin Geisler
pure Python implementation of bdiff.c
r7703 shift += 1
elif b1end == b2:
Augie Fackler
formatting: blacken the codebase...
r43346 while (
b1end + shift < b2end and a[a1end + shift] == b[b1end + shift]
):
Martin Geisler
pure Python implementation of bdiff.c
r7703 shift += 1
Dan Villiom Podlaski Christiansen
pure bdiff: don't use a generator...
r14066 r.append((a1, b1, l1 + shift))
Matt Mackall
many, many trivial check-code fixups
r10282 prev = a2 + shift, b2 + shift, l2 - shift
Gregory Szorc
pure: guard against empty blocks...
r46467
if prev is not None:
r.append(prev)
Dan Villiom Podlaski Christiansen
pure bdiff: don't use a generator...
r14066 return r
Martin Geisler
pure Python implementation of bdiff.c
r7703
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
typing: add type hints to bdiff implementations...
r50493 def bdiff(a: bytes, b: bytes) -> bytes:
Yuya Nishihara
py3: use bytes() to cast to immutable bytes in pure.bdiff.bdiff()
r31641 a = bytes(a).splitlines(True)
b = bytes(b).splitlines(True)
Martin Geisler
pure Python implementation of bdiff.c
r7703
if not a:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 s = b"".join(b)
return s and (struct.pack(b">lll", 0, 0, len(s)) + s)
Martin Geisler
pure Python implementation of bdiff.c
r7703
bin = []
p = [0]
Alex Gaynor
style: never put multiple statements on one line...
r34436 for i in a:
p.append(p[-1] + len(i))
Martin Geisler
pure Python implementation of bdiff.c
r7703
d = difflib.SequenceMatcher(None, a, b).get_matching_blocks()
d = _normalizeblocks(a, b, d)
la = 0
lb = 0
for am, bm, size in d:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 s = b"".join(b[lb:bm])
Martin Geisler
pure Python implementation of bdiff.c
r7703 if am > la or s:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 bin.append(struct.pack(b">lll", p[la], p[am], len(s)) + s)
Martin Geisler
pure Python implementation of bdiff.c
r7703 la = am + size
lb = bm + size
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return b"".join(bin)
Martin Geisler
pure Python implementation of bdiff.c
r7703
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
typing: add type hints to bdiff implementations...
r50493 def blocks(a: bytes, b: bytes) -> List[Tuple[int, int, int, int]]:
Matt Mackall
pure/bdiff: fix circular import
r7944 an = splitnewlines(a)
bn = splitnewlines(b)
Martin Geisler
pure Python implementation of bdiff.c
r7703 d = difflib.SequenceMatcher(None, an, bn).get_matching_blocks()
d = _normalizeblocks(an, bn, d)
return [(i, i + n, j, j + n) for (i, j, n) in d]
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
typing: add type hints to bdiff implementations...
r50493 def fixws(text: bytes, allws: bool) -> bytes:
Patrick Mezard
mdiff: replace wscleanup() regexps with C loops...
r15530 if allws:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 text = re.sub(b'[ \t\r]+', b'', text)
Patrick Mezard
mdiff: replace wscleanup() regexps with C loops...
r15530 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 text = re.sub(b'[ \t\r]+', b' ', text)
text = text.replace(b' \n', b'\n')
Patrick Mezard
mdiff: replace wscleanup() regexps with C loops...
r15530 return text