]> granicus.if.org Git - python/commitdiff
Merged revisions 78461,78482 via svnmerge from
authorFlorent Xicluna <florent.xicluna@gmail.com>
Sat, 27 Feb 2010 11:26:58 +0000 (11:26 +0000)
committerFlorent Xicluna <florent.xicluna@gmail.com>
Sat, 27 Feb 2010 11:26:58 +0000 (11:26 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r78461 | florent.xicluna | 2010-02-26 11:40:58 +0100 (ven, 26 fév 2010) | 2 lines

  #691291: codecs.open() should not convert end of lines on reading and writing.
........
  r78482 | florent.xicluna | 2010-02-27 12:19:18 +0100 (sam, 27 fév 2010) | 2 lines

  Add entry for issue #691291.
........

Lib/codecs.py
Lib/test/test_codecs.py
Misc/NEWS

index 557ccf77acabd0f1897ef04dd4662c36097eb047..a67240a20fa632ff361b9db84088d1e64be5d84b 100644 (file)
@@ -858,10 +858,15 @@ def open(filename, mode='rb', encoding=None, errors='strict', buffering=1):
         parameter.
 
     """
-    if encoding is not None and \
-       'b' not in mode:
-        # Force opening of the file in binary mode
-        mode = mode + 'b'
+    if encoding is not None:
+        if 'U' in mode:
+            # No automatic conversion of '\n' is done on reading and writing
+            mode = mode.strip().replace('U', '')
+            if mode[:1] not in set('rwa'):
+                mode = 'r' + mode
+        if 'b' not in mode:
+            # Force opening of the file in binary mode
+            mode = mode + 'b'
     file = __builtin__.open(filename, mode, buffering)
     if encoding is None:
         return file
index 57420ffb3b800e8522354f0c825cd020709f76f6..7c3a30b9f44b811f3c5da841e3078388107ed42a 100644 (file)
@@ -437,6 +437,21 @@ class UTF16Test(ReadTest):
     def test_errors(self):
         self.assertRaises(UnicodeDecodeError, codecs.utf_16_decode, "\xff", "strict", True)
 
+    def test_bug691291(self):
+        # Files are always opened in binary mode, even if no binary mode was
+        # specified.  This means that no automatic conversion of '\n' is done
+        # on reading and writing.
+        s1 = u'Hello\r\nworld\r\n'
+
+        s = s1.encode(self.encoding)
+        try:
+            with open(test_support.TESTFN, 'wb') as fp:
+                fp.write(s)
+            with codecs.open(test_support.TESTFN, 'U', encoding=self.encoding) as reader:
+                self.assertEqual(reader.read(), s1)
+        finally:
+            test_support.unlink(test_support.TESTFN)
+
 class UTF16LETest(ReadTest):
     encoding = "utf-16-le"
 
index 33601a8d58eae6e2df7a6c3dfa2e1f11f6598e7a..2018e7ce56178d52a9f7024854dba4c4c7536185 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -74,6 +74,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #691291: codecs.open() should not convert end of lines on reading and
+  writing.
+
 - Issue #7975: correct regression in dict methods supported by bsddb.dbshelve.
 
 - Issue #7959: ctypes callback functions are now registered correctly