diffhelpers.py
60 lines
| 1.6 KiB
| text/x-python
|
PythonLexer
Martin Geisler
|
r7702 | # diffhelpers.py - pure Python implementation of diffhelpers.c | ||
# | ||||
# Copyright 2009 Matt Mackall <mpm@selenic.com> and others | ||||
# | ||||
Martin Geisler
|
r8225 | # This software may be used and distributed according to the terms of the | ||
Matt Mackall
|
r10263 | # GNU General Public License version 2 or any later version. | ||
Martin Geisler
|
r7702 | |||
def addlines(fp, hunk, lena, lenb, a, b): | ||||
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() | ||||
c = s[0] | ||||
if s == "\\ No newline at end of file\n": | ||||
fix_newline(hunk, a, b) | ||||
continue | ||||
if c == "\n": | ||||
# Some patches may be missing the control char | ||||
# on empty lines. Supply a leading space. | ||||
s = " \n" | ||||
hunk.append(s) | ||||
if c == "+": | ||||
b.append(s[1:]) | ||||
elif c == "-": | ||||
a.append(s) | ||||
else: | ||||
b.append(s[1:]) | ||||
a.append(s) | ||||
return 0 | ||||
def fix_newline(hunk, a, b): | ||||
l = hunk[-1] | ||||
Benoit Boissinot
|
r10551 | # tolerate CRLF in last line | ||
if l.endswith('\r\n'): | ||||
hline = l[:-2] | ||||
else: | ||||
hline = l[:-1] | ||||
c = hline[0] | ||||
Martin Geisler
|
r7702 | |||
if c == " " or c == "+": | ||||
Benoit Boissinot
|
r10551 | b[-1] = hline[1:] | ||
Martin Geisler
|
r7702 | if c == " " or c == "-": | ||
a[-1] = hline | ||||
hunk[-1] = hline | ||||
return 0 | ||||
def testhunk(a, b, bstart): | ||||
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 | ||||