diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-01-21 00:45:36 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-01-21 00:45:36 (GMT) |
commit | e741cc607c226c76fef473bf772d42fc63269b9b (patch) | |
tree | c7914f5e141059584cfc3ebea80b01009bb0ad3d | |
parent | acdc84abcf106e4178d18363b899d0f4218008f4 (diff) | |
download | cpython-e741cc607c226c76fef473bf772d42fc63269b9b.zip cpython-e741cc607c226c76fef473bf772d42fc63269b9b.tar.gz cpython-e741cc607c226c76fef473bf772d42fc63269b9b.tar.bz2 |
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.py | 11 | ||||
-rw-r--r-- | Misc/NEWS | 5 | ||||
-rw-r--r-- | Modules/_fileio.c | 13 |
3 files changed, 29 insertions, 0 deletions
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 967018e..f0b38b6 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): @@ -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 2a86e07..2fc6de8 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: |