]> granicus.if.org Git - python/commitdiff
Merged revisions 68835 via svnmerge from
authorAntoine Pitrou <solipsis@pitrou.net>
Wed, 21 Jan 2009 00:55:13 +0000 (00:55 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Wed, 21 Jan 2009 00:55:13 +0000 (00:55 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r68835 | antoine.pitrou | 2009-01-21 01:45:36 +0100 (mer., 21 janv. 2009) | 6 lines

  Issue #5008: When a file is opened in append mode with the new IO library,
  do an explicit seek to the end of file (so that e.g. tell() returns the
  file size rather than 0). This is consistent with the behaviour of the
  traditional 2.x file object.
........

Lib/test/test_io.py
Misc/NEWS
Modules/_fileio.c

index 489e5605f65200bc3079ca11af5fc378c4cd7190..6265258493d17797d6d66bf3a4e9b4fe3385f6b1 100644 (file)
@@ -233,6 +233,17 @@ class IOTest(unittest.TestCase):
             else:
                 self.fail("1/0 didn't raise an exception")
 
+    # issue 5008
+    def test_append_mode_tell(self):
+        with io.open(support.TESTFN, "wb") as f:
+            f.write(b"xxx")
+        with io.open(support.TESTFN, "ab", buffering=0) as f:
+            self.assertEqual(f.tell(), 3)
+        with io.open(support.TESTFN, "ab") as f:
+            self.assertEqual(f.tell(), 3)
+        with io.open(support.TESTFN, "a") as f:
+            self.assert_(f.tell() > 0)
+
     def test_destructor(self):
         record = []
         class MyFileIO(io.FileIO):
index 35506cb6f3337016beb7eeb2639a2469ea41cac5..b92048c2c6d59d97082adec36734e8263cf52c46 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -137,6 +137,11 @@ Core and Builtins
 Library
 -------
 
+- Issue #5008: When a file is opened in append mode with the new IO library,
+  do an explicit seek to the end of file (so that e.g. tell() returns the
+  file size rather than 0). This is consistent with the behaviour of the
+  traditional 2.x file object.
+
 - Issue #5013: Fixed a bug in FileHandler which occurred when the delay
   parameter was set.
 
index 5b840c000a81a7659eef9cf3d079d44c4f6900d6..7a71837d7bb5a17ef800af4aa570c67117edcb60 100644 (file)
@@ -55,6 +55,9 @@ PyTypeObject PyFileIO_Type;
 
 #define PyFileIO_Check(op) (PyObject_TypeCheck((op), &PyFileIO_Type))
 
+static PyObject *
+portable_lseek(int fd, PyObject *posobj, int whence);
+
 /* Returns 0 on success, -1 with exception set on failure. */
 static int
 internal_close(PyFileIOObject *self)
@@ -315,6 +318,16 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
                        goto error;
        }
 
+       if (append) {
+               /* For consistent behaviour, we explicitly seek to the
+                  end of file (otherwise, it might be done only on the
+                  first write()). */
+               PyObject *pos = portable_lseek(self->fd, NULL, 2);
+               if (pos == NULL)
+                       goto error;
+               Py_DECREF(pos);
+       }
+
        goto done;
 
  error: