mercurial/pure/diffhelpers.py
changeset 37571 0ea8b9576d7c
parent 37570 c4c8d0d1267f
child 37572 c6b8d614690a
equal deleted inserted replaced
37570:c4c8d0d1267f 37571:0ea8b9576d7c
     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 of the
       
     6 # GNU General Public License version 2 or any later version.
       
     7 
       
     8 from __future__ import absolute_import
       
     9 
       
    10 def addlines(fp, hunk, lena, lenb, a, b):
       
    11     """Read lines from fp into the hunk
       
    12 
       
    13     The hunk is parsed into two arrays, a and b. a gets the old state of
       
    14     the text, b gets the new state. The control char from the hunk is saved
       
    15     when inserting into a, but not b (for performance while deleting files.)
       
    16     """
       
    17     while True:
       
    18         todoa = lena - len(a)
       
    19         todob = lenb - len(b)
       
    20         num = max(todoa, todob)
       
    21         if num == 0:
       
    22             break
       
    23         for i in xrange(num):
       
    24             s = fp.readline()
       
    25             if s == "\\ No newline at end of file\n":
       
    26                 fixnewline(hunk, a, b)
       
    27                 continue
       
    28             if s == "\n":
       
    29                 # Some patches may be missing the control char
       
    30                 # on empty lines. Supply a leading space.
       
    31                 s = " \n"
       
    32             hunk.append(s)
       
    33             if s.startswith('+'):
       
    34                 b.append(s[1:])
       
    35             elif s.startswith('-'):
       
    36                 a.append(s)
       
    37             else:
       
    38                 b.append(s[1:])
       
    39                 a.append(s)
       
    40     return 0
       
    41 
       
    42 def fixnewline(hunk, a, b):
       
    43     """Fix up the last lines of a and b when the patch has no newline at EOF"""
       
    44     l = hunk[-1]
       
    45     # tolerate CRLF in last line
       
    46     if l.endswith('\r\n'):
       
    47         hline = l[:-2]
       
    48     else:
       
    49         hline = l[:-1]
       
    50 
       
    51     if hline.startswith((' ', '+')):
       
    52         b[-1] = hline[1:]
       
    53     if hline.startswith((' ', '-')):
       
    54         a[-1] = hline
       
    55     hunk[-1] = hline
       
    56     return 0
       
    57 
       
    58 def testhunk(a, b, bstart):
       
    59     """Compare the lines in a with the lines in b
       
    60 
       
    61     a is assumed to have a control char at the start of each line, this char
       
    62     is ignored in the compare.
       
    63     """
       
    64     alen = len(a)
       
    65     blen = len(b)
       
    66     if alen > blen - bstart:
       
    67         return -1
       
    68     for i in xrange(alen):
       
    69         if a[i][1:] != b[i + bstart]:
       
    70             return -1
       
    71     return 0