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.
--- a/hgext/win32text.py Sun Jul 08 19:59:02 2007 +0200
+++ b/hgext/win32text.py Mon Jul 09 10:46:41 2007 -0700
@@ -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,
+ })