##// END OF EJS Templates
rust: Add type annotation to fix inference on Rust Nightly...
rust: Add type annotation to fix inference on Rust Nightly When compiling with Rust Nightly, the im-rs crate silently makes use of the experimental language feature for trait impl specialization. This apperently changes public its APIs in subtle ways such that type inference of some user code can fail where it succeeds when specialization is disabled. This made Mercurial’s Rust unit tests have compilation errors on Nightly. I have not managed to find the exactl root cause, but I wrote down my findings so far at https://github.com/bodil/im-rs/issues/188 This adds type annotation to make unit tests rely less on type inference and work around the issue. Differential Revision: https://phab.mercurial-scm.org/D10742

File last commit:

r47575:d4ba4d51 default
r48067:402bd66c default
Show More
diffhelper.py
83 lines | 2.3 KiB | text/x-python | PythonLexer
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 # diffhelper.py - helper routines for patch
#
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2009 Olivia Mackall <olivia@selenic.com> and others
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 #
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import
from .i18n import _
from . import (
error,
Gregory Szorc
global: use pycompat.xrange()...
r38806 pycompat,
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 )
Rodrigo Damazio Bovendorp
diff: move no-eol text constant to a common location...
r45714 MISSING_NEWLINE_MARKER = b'\\ No newline at end of file\n'
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 def addlines(fp, hunk, lena, lenb, a, b):
"""Read lines from fp into the hunk
The hunk is parsed into two arrays, a and b. a gets the old state of
the text, b gets the new state. The control char from the hunk is saved
when inserting into a, but not b (for performance while deleting files.)
"""
while True:
todoa = lena - len(a)
todob = lenb - len(b)
num = max(todoa, todob)
if num == 0:
break
Gregory Szorc
global: use pycompat.xrange()...
r38806 for i in pycompat.xrange(num):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 s = fp.readline()
if not s:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b'incomplete hunk'))
Rodrigo Damazio Bovendorp
diff: move no-eol text constant to a common location...
r45714 if s == MISSING_NEWLINE_MARKER:
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 fixnewline(hunk, a, b)
continue
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if s == b'\n' or s == b'\r\n':
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 # Some patches may be missing the control char
# on empty lines. Supply a leading space.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 s = b' ' + s
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 hunk.append(s)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if s.startswith(b'+'):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 b.append(s[1:])
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif s.startswith(b'-'):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 a.append(s)
else:
b.append(s[1:])
a.append(s)
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 def fixnewline(hunk, a, b):
"""Fix up the last lines of a and b when the patch has no newline at EOF"""
l = hunk[-1]
# tolerate CRLF in last line
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if l.endswith(b'\r\n'):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 hline = l[:-2]
else:
hline = l[:-1]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if hline.startswith((b' ', b'+')):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 b[-1] = hline[1:]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if hline.startswith((b' ', b'-')):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 a[-1] = hline
hunk[-1] = hline
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 def testhunk(a, b, bstart):
"""Compare the lines in a with the lines in b
a is assumed to have a control char at the start of each line, this char
is ignored in the compare.
"""
alen = len(a)
blen = len(b)
if alen > blen - bstart or bstart < 0:
return False
Gregory Szorc
global: use pycompat.xrange()...
r38806 for i in pycompat.xrange(alen):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 if a[i][1:] != b[i + bstart]:
return False
return True