[Python-checkins] cpython (merge 3.3 -> default): Issue #16800: tempfile.gettempdir() no longer left temporary files when
serhiy.storchaka
python-checkins at python.org
Tue Feb 12 23:42:31 CET 2013
http://hg.python.org/cpython/rev/b66a5b41d82f
changeset: 82184:b66a5b41d82f
parent: 82179:7727be7613f9
parent: 82183:6f432bb11b28
user: Serhiy Storchaka <storchaka at gmail.com>
date: Wed Feb 13 00:38:48 2013 +0200
summary:
Issue #16800: tempfile.gettempdir() no longer left temporary files when
the disk is full. Original patch by Amir Szekely.
files:
Lib/tempfile.py | 13 +++++---
Lib/test/test_tempfile.py | 40 ++++++++++++++++++++++++++-
Misc/ACKS | 1 +
Misc/NEWS | 3 ++
4 files changed, 51 insertions(+), 6 deletions(-)
diff --git a/Lib/tempfile.py b/Lib/tempfile.py
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -174,11 +174,14 @@
filename = _os.path.join(dir, name)
try:
fd = _os.open(filename, _bin_openflags, 0o600)
- fp = _io.open(fd, 'wb')
- fp.write(b'blat')
- fp.close()
- _os.unlink(filename)
- del fp, fd
+ try:
+ try:
+ fp = _io.open(fd, 'wb', buffering=0, closefd=False)
+ fp.write(b'blat')
+ finally:
+ _os.close(fd)
+ finally:
+ _os.unlink(filename)
return dir
except FileExistsError:
pass
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -1,6 +1,7 @@
# tempfile.py unit tests.
import tempfile
import errno
+import io
import os
import signal
import sys
@@ -198,7 +199,44 @@
# paths in this list.
-# We test _get_default_tempdir by testing gettempdir.
+# We test _get_default_tempdir some more by testing gettempdir.
+
+class TestGetDefaultTempdir(BaseTestCase):
+ """Test _get_default_tempdir()."""
+
+ def test_no_files_left_behind(self):
+ # use a private empty directory
+ with tempfile.TemporaryDirectory() as our_temp_directory:
+ # force _get_default_tempdir() to consider our empty directory
+ def our_candidate_list():
+ return [our_temp_directory]
+
+ with support.swap_attr(tempfile, "_candidate_tempdir_list",
+ our_candidate_list):
+ # verify our directory is empty after _get_default_tempdir()
+ tempfile._get_default_tempdir()
+ self.assertEqual(os.listdir(our_temp_directory), [])
+
+ def raise_OSError(*args, **kwargs):
+ raise OSError()
+
+ with support.swap_attr(io, "open", raise_OSError):
+ # test again with failing io.open()
+ with self.assertRaises(FileNotFoundError):
+ tempfile._get_default_tempdir()
+ self.assertEqual(os.listdir(our_temp_directory), [])
+
+ open = io.open
+ def bad_writer(*args, **kwargs):
+ fp = open(*args, **kwargs)
+ fp.write = raise_OSError
+ return fp
+
+ with support.swap_attr(io, "open", bad_writer):
+ # test again with failing write()
+ with self.assertRaises(FileNotFoundError):
+ tempfile._get_default_tempdir()
+ self.assertEqual(os.listdir(our_temp_directory), [])
class TestGetCandidateNames(BaseTestCase):
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1175,6 +1175,7 @@
Paul Swartz
Thenault Sylvain
Péter Szabó
+Amir Szekely
Arfrever Frehtes Taifersar Arahesis
Neil Tallim
Geoff Talvola
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -250,6 +250,9 @@
Library
-------
+- Issue #16800: tempfile.gettempdir() no longer left temporary files when
+ the disk is full. Original patch by Amir Szekely.
+
- Issue #16564: Fixed regression relative to Python2 in the operation of
email.encoders.encode_7or8bit when used with binary data.
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list