From: Guido van Rossum Date: Thu, 25 Oct 2007 23:21:03 +0000 (+0000) Subject: Patch # 1323 by Amaury Forgeot d'Arc. X-Git-Tag: v3.0a2~276 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=79b79eeab239f97d2a1374a83799aebc11e9ae7e;p=python 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... --- diff --git a/Lib/io.py b/Lib/io.py index 07846bfb83..b201cb2bb2 100644 --- a/Lib/io.py +++ b/Lib/io.py @@ -597,9 +597,24 @@ class _BufferedIOMixin(BufferedIOBase): 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 ### diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py index f2718b2274..ab29932e8f 100644 --- a/Lib/test/test_file.py +++ b/Lib/test/test_file.py @@ -181,12 +181,13 @@ class OtherFileTests(unittest.TestCase): self.assertEquals(d, s) def testTruncateOnWindows(self): + # SF bug + # "file.truncate fault on windows" + os.unlink(TESTFN) + f = open(TESTFN, 'wb') - def bug801631(): - # SF bug - # "file.truncate fault on windows" - f = open(TESTFN, 'wb') + try: f.write(b'12345678901') # 11 bytes f.close() @@ -205,10 +206,8 @@ class OtherFileTests(unittest.TestCase): 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):