[Python-3000-checkins] r58658 - in python/branches/py3k/Lib: io.py test/test_file.py

guido.van.rossum python-3000-checkins at python.org
Fri Oct 26 01:21:03 CEST 2007


Author: guido.van.rossum
Date: Fri Oct 26 01:21:03 2007
New Revision: 58658

Modified:
   python/branches/py3k/Lib/io.py
   python/branches/py3k/Lib/test/test_file.py
Log:
Patch # 1323 by Amaury Forgeot d'Arc.
This patch corrects a problem in test_file.py on Windows:
f.truncate() seeks to the truncation point, but does not empty the
buffers. In the test, f.tell() returns -1...


Modified: python/branches/py3k/Lib/io.py
==============================================================================
--- python/branches/py3k/Lib/io.py	(original)
+++ python/branches/py3k/Lib/io.py	Fri Oct 26 01:21:03 2007
@@ -597,9 +597,24 @@
         return self.raw.tell()
 
     def truncate(self, pos=None):
+        # On Windows, the truncate operation changes the current position
+        # to the end of the file, which may leave us with desynchronized
+        # buffers.
+        # Since we promise that truncate() won't change the current position,
+        # the easiest thing is to capture current pos now and seek back to
+        # it at the end.
+
+        initialpos = self.tell()
         if pos is None:
-            pos = self.tell()
-        return self.raw.truncate(pos)
+            pos = initialpos
+
+        # Flush the stream.  We're mixing buffered I/O with lower-level I/O,
+        # and a flush may be necessary to synch both views of the current
+        # file state.
+        self.flush()
+        newpos = self.raw.truncate(pos)
+        self.seek(initialpos)
+        return newpos
 
     ### Flush and close ###
 

Modified: python/branches/py3k/Lib/test/test_file.py
==============================================================================
--- python/branches/py3k/Lib/test/test_file.py	(original)
+++ python/branches/py3k/Lib/test/test_file.py	Fri Oct 26 01:21:03 2007
@@ -181,12 +181,13 @@
             self.assertEquals(d, s)
 
     def testTruncateOnWindows(self):
+        # SF bug <http://www.python.org/sf/801631>
+        # "file.truncate fault on windows"
+
         os.unlink(TESTFN)
+        f = open(TESTFN, 'wb')
 
-        def bug801631():
-            # SF bug <http://www.python.org/sf/801631>
-            # "file.truncate fault on windows"
-            f = open(TESTFN, 'wb')
+        try:
             f.write(b'12345678901')   # 11 bytes
             f.close()
 
@@ -205,10 +206,8 @@
             size = os.path.getsize(TESTFN)
             if size != 5:
                 self.fail("File size after ftruncate wrong %d" % size)
-
-        try:
-            bug801631()
         finally:
+            f.close()
             os.unlink(TESTFN)
 
     def testIteration(self):


More information about the Python-3000-checkins mailing list