diff -r 155fe35534d3 -r 1720d70cd6d4 mercurial/patch.py --- a/mercurial/patch.py Sun Dec 20 17:18:02 2009 +0100 +++ b/mercurial/patch.py Sun Dec 20 17:18:04 2009 +0100 @@ -239,6 +239,7 @@ self.fp = fp self.buf = [] self.textmode = textmode + self.eol = None def push(self, line): if line is not None: @@ -250,6 +251,11 @@ del self.buf[0] return l l = self.fp.readline() + if not self.eol: + if l.endswith('\r\n'): + self.eol = '\r\n' + elif l.endswith('\n'): + self.eol = '\n' if self.textmode and l.endswith('\r\n'): l = l[:-2] + '\n' return l @@ -264,13 +270,13 @@ # @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1 unidesc = re.compile('@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@') contextdesc = re.compile('(---|\*\*\*) (\d+)(,(\d+))? (---|\*\*\*)') -eolmodes = ['strict', 'crlf', 'lf'] +eolmodes = ['strict', 'crlf', 'lf', 'auto'] class patchfile(object): def __init__(self, ui, fname, opener, missing=False, eolmode='strict'): self.fname = fname self.eolmode = eolmode - self.eol = {'strict': None, 'crlf': '\r\n', 'lf': '\n'}[eolmode] + self.eol = None self.opener = opener self.ui = ui self.lines = [] @@ -298,7 +304,10 @@ return [os.readlink(fname)] fp = self.opener(fname, 'r') try: - return list(linereader(fp, self.eolmode != 'strict')) + lr = linereader(fp, self.eolmode != 'strict') + lines = list(lr) + self.eol = lr.eol + return lines finally: fp.close() @@ -312,10 +321,17 @@ else: fp = self.opener(fname, 'w') try: - if self.eol and self.eol != '\n': + if self.eolmode == 'auto' and self.eol: + eol = self.eol + elif self.eolmode == 'crlf': + eol = '\r\n' + else: + eol = '\n' + + if self.eolmode != 'strict' and eol != '\n': for l in lines: if l and l[-1] == '\n': - l = l[:-1] + self.eol + l = l[:-1] + eol fp.write(l) else: fp.writelines(lines)