##// END OF EJS Templates
export: serialize revisions to be exported per destination file...
export: serialize revisions to be exported per destination file Prepares for porting to the formatter API, where we can't simply append to existing files because JSON can't be streamed for example. The modemap hack is removed since cmdutil.export() was the only user. I also made the destination filename printed only once.

File last commit:

r37593:230eb959 default
r37619:2e0e6131 default
Show More
diffhelpers.py
77 lines | 2.2 KiB | text/x-python | PythonLexer
Yuya Nishihara
diffhelpers: move out of pure package
r37589 # 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
Yuya Nishihara
patch: error out if reached to EOF while reading hunk...
r37591 from .i18n import _
from . import (
error,
)
Yuya Nishihara
diffhelpers: move out of pure package
r37589 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()
Yuya Nishihara
patch: error out if reached to EOF while reading hunk...
r37591 if not s:
raise error.ParseError(_('incomplete hunk'))
Yuya Nishihara
diffhelpers: move out of pure package
r37589 if s == "\\ No newline at end of file\n":
fixnewline(hunk, a, b)
continue
Yuya Nishihara
diffhelpers: be more tolerant for stripped empty lines of CRLF ending...
r37593 if s == '\n' or s == '\r\n':
Yuya Nishihara
diffhelpers: move out of pure package
r37589 # Some patches may be missing the control char
# on empty lines. Supply a leading space.
Yuya Nishihara
diffhelpers: be more tolerant for stripped empty lines of CRLF ending...
r37593 s = ' ' + s
Yuya Nishihara
diffhelpers: move out of pure package
r37589 hunk.append(s)
if s.startswith('+'):
b.append(s[1:])
elif s.startswith('-'):
a.append(s)
else:
b.append(s[1:])
a.append(s)
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
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:
Yuya Nishihara
diffhelpers: make return value of testhunk() more Pythonic...
r37592 return False
Yuya Nishihara
diffhelpers: move out of pure package
r37589 for i in xrange(alen):
if a[i][1:] != b[i + bstart]:
Yuya Nishihara
diffhelpers: make return value of testhunk() more Pythonic...
r37592 return False
return True