Mercurial > public > mercurial-scm > hg
diff mercurial/diffhelpers.py @ 37571:0ea8b9576d7c
diffhelpers: move out of pure package
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Mon, 09 Apr 2018 20:54:00 +0900 |
parents | mercurial/pure/diffhelpers.py@c4c8d0d1267f |
children | c6b8d614690a |
line wrap: on
line diff
--- /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 <mpm@selenic.com> 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