mercurial/pure/diffhelpers.py
changeset 7702 f6bb40554e34
child 8225 46293a0c7e9f
equal deleted inserted replaced
7701:4bdead043d8d 7702:f6bb40554e34
       
     1 # diffhelpers.py - pure Python implementation of diffhelpers.c
       
     2 #
       
     3 # Copyright 2009 Matt Mackall <mpm@selenic.com> and others
       
     4 #
       
     5 # This software may be used and distributed according to the terms
       
     6 # of the GNU General Public License, incorporated herein by reference.
       
     7 
       
     8 def addlines(fp, hunk, lena, lenb, a, b):
       
     9     while True:
       
    10         todoa = lena - len(a)
       
    11         todob = lenb - len(b)
       
    12         num = max(todoa, todob)
       
    13         if num == 0:
       
    14             break
       
    15         for i in xrange(num):
       
    16             s = fp.readline()
       
    17             c = s[0]
       
    18             if s == "\\ No newline at end of file\n":
       
    19                 fix_newline(hunk, a, b)
       
    20                 continue
       
    21             if c == "\n":
       
    22                 # Some patches may be missing the control char
       
    23                 # on empty lines. Supply a leading space.
       
    24                 s = " \n"
       
    25             hunk.append(s)
       
    26             if c == "+":
       
    27                 b.append(s[1:])
       
    28             elif c == "-":
       
    29                 a.append(s)
       
    30             else:
       
    31                 b.append(s[1:])
       
    32                 a.append(s)
       
    33     return 0
       
    34 
       
    35 def fix_newline(hunk, a, b):
       
    36     l = hunk[-1]
       
    37     c = l[0]
       
    38     hline = l[:-1]
       
    39 
       
    40     if c == " " or c == "+":
       
    41         b[-1] = l[1:-1]
       
    42     if c == " " or c == "-":
       
    43         a[-1] = hline
       
    44     hunk[-1] = hline
       
    45     return 0
       
    46 
       
    47 
       
    48 def testhunk(a, b, bstart):
       
    49     alen = len(a)
       
    50     blen = len(b)
       
    51     if alen > blen - bstart:
       
    52         return -1
       
    53     for i in xrange(alen):
       
    54         if a[i][1:] != b[i + bstart]:
       
    55             return -1
       
    56     return 0