diffhelpers.py
71 lines
| 2.1 KiB
| text/x-python
|
PythonLexer
|
r7702 | # diffhelpers.py - pure Python implementation of diffhelpers.c | ||
# | ||||
# Copyright 2009 Matt Mackall <mpm@selenic.com> and others | ||||
# | ||||
|
r8225 | # This software may be used and distributed according to the terms of the | ||
|
r10263 | # GNU General Public License version 2 or any later version. | ||
|
r7702 | |||
|
r27336 | from __future__ import absolute_import | ||
|
r7702 | def addlines(fp, hunk, lena, lenb, a, b): | ||
|
r37585 | """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.) | ||||
""" | ||||
|
r7702 | 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": | ||||
|
r37588 | fixnewline(hunk, a, b) | ||
|
r7702 | continue | ||
|
r37584 | if s == "\n": | ||
|
r7702 | # Some patches may be missing the control char | ||
# on empty lines. Supply a leading space. | ||||
s = " \n" | ||||
hunk.append(s) | ||||
|
r37584 | if s.startswith('+'): | ||
|
r7702 | b.append(s[1:]) | ||
|
r37584 | elif s.startswith('-'): | ||
|
r7702 | a.append(s) | ||
else: | ||||
b.append(s[1:]) | ||||
a.append(s) | ||||
return 0 | ||||
|
r37588 | def fixnewline(hunk, a, b): | ||
|
r37585 | """Fix up the last lines of a and b when the patch has no newline at EOF""" | ||
|
r7702 | l = hunk[-1] | ||
|
r10551 | # tolerate CRLF in last line | ||
if l.endswith('\r\n'): | ||||
hline = l[:-2] | ||||
else: | ||||
hline = l[:-1] | ||||
|
r7702 | |||
|
r37584 | if hline.startswith((' ', '+')): | ||
|
r10551 | b[-1] = hline[1:] | ||
|
r37584 | if hline.startswith((' ', '-')): | ||
|
r7702 | a[-1] = hline | ||
hunk[-1] = hline | ||||
return 0 | ||||
def testhunk(a, b, bstart): | ||||
|
r37585 | """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. | ||||
""" | ||||
|
r7702 | 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 | ||||