summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-01-21 01:05:40 +0000
committerAntoine Pitrou <solipsis@pitrou.net>2009-01-21 01:05:40 +0000
commit25f4347a9ad97babfb74d6aedbec00013300f246 (patch)
tree3cf12f18a5fea28a628320ebb6f4f163260f92fb
parent0c0f9602c14aee26a8b5d588bb19d107be7674a7 (diff)
downloadcpython-git-25f4347a9ad97babfb74d6aedbec00013300f246.tar.gz
Merged revisions 68836 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r68836 | antoine.pitrou | 2009-01-21 01:55:13 +0100 (mer., 21 janv. 2009) | 12 lines Merged revisions 68835 via svnmerge from 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. ........ ................
-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 e8bba86ae0..987fca4ea7 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -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):
diff --git a/Misc/NEWS b/Misc/NEWS
index 443cffb16d..234c200f91 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -98,6 +98,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 22b473c513..300449349b 100644
--- a/Modules/_fileio.c
+++ b/Modules/_fileio.c
@@ -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: