# HG changeset patch # User Yuya Nishihara # Date 1523274840 -32400 # Node ID 0ea8b9576d7c658a0e1dfb77a790e48c6fbd084d # Parent c4c8d0d1267fefb1752d99ae525db83ee2c483bf diffhelpers: move out of pure package diff -r c4c8d0d1267f -r 0ea8b9576d7c mercurial/diffhelpers.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial/diffhelpers.py Mon Apr 09 20:54:00 2018 +0900 @@ -0,0 +1,71 @@ +# diffhelpers.py - helper routines for patch +# +# Copyright 2009 Matt Mackall and others +# +# 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 + +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 + for i in xrange(num): + s = fp.readline() + if s == "\\ No newline at end of file\n": + fixnewline(hunk, a, b) + continue + if s == "\n": + # Some patches may be missing the control char + # on empty lines. Supply a leading space. + s = " \n" + hunk.append(s) + if s.startswith('+'): + b.append(s[1:]) + elif s.startswith('-'): + a.append(s) + else: + b.append(s[1:]) + a.append(s) + return 0 + +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 + if l.endswith('\r\n'): + hline = l[:-2] + else: + hline = l[:-1] + + if hline.startswith((' ', '+')): + b[-1] = hline[1:] + if hline.startswith((' ', '-')): + a[-1] = hline + hunk[-1] = hline + return 0 + +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: + return -1 + for i in xrange(alen): + if a[i][1:] != b[i + bstart]: + return -1 + return 0 diff -r c4c8d0d1267f -r 0ea8b9576d7c mercurial/patch.py --- a/mercurial/patch.py Mon Apr 09 20:52:54 2018 +0900 +++ b/mercurial/patch.py Mon Apr 09 20:54:00 2018 +0900 @@ -28,6 +28,7 @@ ) from . import ( copies, + diffhelpers, encoding, error, mail, @@ -39,7 +40,6 @@ util, vfs as vfsmod, ) -from .pure import diffhelpers from .utils import ( dateutil, procutil, diff -r c4c8d0d1267f -r 0ea8b9576d7c mercurial/pure/diffhelpers.py --- a/mercurial/pure/diffhelpers.py Mon Apr 09 20:52:54 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -# diffhelpers.py - pure Python implementation of diffhelpers.c -# -# Copyright 2009 Matt Mackall and others -# -# 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 - -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 - for i in xrange(num): - s = fp.readline() - if s == "\\ No newline at end of file\n": - fixnewline(hunk, a, b) - continue - if s == "\n": - # Some patches may be missing the control char - # on empty lines. Supply a leading space. - s = " \n" - hunk.append(s) - if s.startswith('+'): - b.append(s[1:]) - elif s.startswith('-'): - a.append(s) - else: - b.append(s[1:]) - a.append(s) - return 0 - -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 - if l.endswith('\r\n'): - hline = l[:-2] - else: - hline = l[:-1] - - if hline.startswith((' ', '+')): - b[-1] = hline[1:] - if hline.startswith((' ', '-')): - a[-1] = hline - hunk[-1] = hline - return 0 - -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: - return -1 - for i in xrange(alen): - if a[i][1:] != b[i + bstart]: - return -1 - return 0