# HG changeset patch # User Lee Cantey # Date 1184003201 25200 # Node ID 30762680fcd219ddb4652d647660b4236a7a7c1a # Parent 2192001e4bb489b96bcd8a6b1f2bcd1774c912e1 Fix for win32text corrupting files that have CRLF line endings. (issue302) Also generate a warning when encountering this condition. From Shun-ichi Goto in attachment win32text-patch3.txt for issue 302. diff --git a/hgext/win32text.py b/hgext/win32text.py --- a/hgext/win32text.py +++ b/hgext/win32text.py @@ -1,28 +1,45 @@ -import mercurial.util - -def dumbdecode(s, cmd): - return s.replace('\n', '\r\n') - -def dumbencode(s, cmd): - return s.replace('\r\n', '\n') - -def clevertest(s, cmd): - if '\0' in s: return False - return True - -def cleverdecode(s, cmd): - if clevertest(s, cmd): - return dumbdecode(s, cmd) - return s - -def cleverencode(s, cmd): - if clevertest(s, cmd): - return dumbencode(s, cmd) - return s - -mercurial.util.filtertable.update({ - 'dumbdecode:': dumbdecode, - 'dumbencode:': dumbencode, - 'cleverdecode:': cleverdecode, - 'cleverencode:': cleverencode, - }) +from mercurial import util, ui +from mercurial.i18n import gettext as _ +import re + +# regexp for single LF without CR preceding. +re_single_lf = re.compile('(^|[^\r])\n', re.MULTILINE) + +def dumbdecode(s, cmd): + # warn if already has CRLF in repository. + # it might cause unexpected eol conversion. + # see issue 302: + # http://www.selenic.com/mercurial/bts/issue302 + if '\r\n' in s: + u = ui.ui() + u.warn(_('WARNING: file in repository already has CRLF line ending \n' + ' which does not need eol conversion by win32text plugin.\n' + ' Please reconsider encode/decode setting in' + ' mercurial.ini or .hg/hgrc\n' + ' before next commit.\n')) + # replace single LF to CRLF + return re_single_lf.sub('\\1\r\n', s) + +def dumbencode(s, cmd): + return s.replace('\r\n', '\n') + +def clevertest(s, cmd): + if '\0' in s: return False + return True + +def cleverdecode(s, cmd): + if clevertest(s, cmd): + return dumbdecode(s, cmd) + return s + +def cleverencode(s, cmd): + if clevertest(s, cmd): + return dumbencode(s, cmd) + return s + +util.filtertable.update({ + 'dumbdecode:': dumbdecode, + 'dumbencode:': dumbencode, + 'cleverdecode:': cleverdecode, + 'cleverencode:': cleverencode, + })