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.
This commit is contained in:
parent
acdc84abcf
commit
e741cc607c
|
@ -232,6 +232,17 @@ class IOTest(unittest.TestCase):
|
||||||
else:
|
else:
|
||||||
self.fail("1/0 didn't raise an exception")
|
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):
|
def test_destructor(self):
|
||||||
record = []
|
record = []
|
||||||
class MyFileIO(io.FileIO):
|
class MyFileIO(io.FileIO):
|
||||||
|
|
|
@ -145,6 +145,11 @@ Core and Builtins
|
||||||
Library
|
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
|
- Issue #5013: Fixed a bug in FileHandler which occurred when the delay
|
||||||
parameter was set.
|
parameter was set.
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,9 @@ PyTypeObject PyFileIO_Type;
|
||||||
|
|
||||||
#define PyFileIO_Check(op) (PyObject_TypeCheck((op), &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. */
|
/* Returns 0 on success, errno (which is < 0) on failure. */
|
||||||
static int
|
static int
|
||||||
internal_close(PyFileIOObject *self)
|
internal_close(PyFileIOObject *self)
|
||||||
|
@ -296,6 +299,16 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
|
||||||
goto error;
|
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;
|
goto done;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
|
Loading…
Reference in New Issue