Fix for win32text corrupting files that have CRLF line endings. (issue302)
authorLee Cantey <lcantey@gmail.com>
Mon, 09 Jul 2007 10:46:41 -0700
changeset 4858 30762680fcd2
parent 4857 2192001e4bb4
child 4859 8c5aca855b5d
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.
hgext/win32text.py
--- 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,
+    })