summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-01-21 00:45:36 +0000
committerAntoine Pitrou <solipsis@pitrou.net>2009-01-21 00:45:36 +0000
commite741cc607c226c76fef473bf772d42fc63269b9b (patch)
treec7914f5e141059584cfc3ebea80b01009bb0ad3d
parentacdc84abcf106e4178d18363b899d0f4218008f4 (diff)
downloadcpython-git-e741cc607c226c76fef473bf772d42fc63269b9b.tar.gz
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.
-rw-r--r--Lib/test/test_io.py11
-rw-r--r--Misc/NEWS5
-rw-r--r--Modules/_fileio.c13
3 files changed, 29 insertions, 0 deletions
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 967018ea45..f0b38b6f7a 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -232,6 +232,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(test_support.TESTFN, "wb") as f:
+ f.write(b"xxx")
+ with io.open(test_support.TESTFN, "ab", buffering=0) as f:
+ self.assertEqual(f.tell(), 3)
+ with io.open(test_support.TESTFN, "ab") as f:
+ self.assertEqual(f.tell(), 3)
+ with io.open(test_support.TESTFN, "a") as f:
+ self.assert_(f.tell() > 0)
+
def test_destructor(self):
record = []
class MyFileIO(io.FileIO):
diff --git a/Misc/NEWS b/Misc/NEWS
index a3f0242ca9..204ea80915 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -145,6 +145,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.
diff --git a/Modules/_fileio.c b/Modules/_fileio.c
index 2a86e07e43..2fc6de887a 100644
--- a/Modules/_fileio.c
+++ b/Modules/_fileio.c
@@ -41,6 +41,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, errno (which is < 0) on failure. */
static int
internal_close(PyFileIOObject *self)
@@ -296,6 +299,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: