Issue #16800: tempfile.gettempdir() no longer left temporary files when
the disk is full. Original patch by Amir Szekely.
This commit is contained in:
commit
ff7fef9601
|
@ -172,11 +172,14 @@ def _get_default_tempdir():
|
||||||
filename = _os.path.join(dir, name)
|
filename = _os.path.join(dir, name)
|
||||||
try:
|
try:
|
||||||
fd = _os.open(filename, _bin_openflags, 0o600)
|
fd = _os.open(filename, _bin_openflags, 0o600)
|
||||||
fp = _io.open(fd, 'wb')
|
try:
|
||||||
fp.write(b'blat')
|
try:
|
||||||
fp.close()
|
fp = _io.open(fd, 'wb', buffering=0, closefd=False)
|
||||||
_os.unlink(filename)
|
fp.write(b'blat')
|
||||||
del fp, fd
|
finally:
|
||||||
|
_os.close(fd)
|
||||||
|
finally:
|
||||||
|
_os.unlink(filename)
|
||||||
return dir
|
return dir
|
||||||
except FileExistsError:
|
except FileExistsError:
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# tempfile.py unit tests.
|
# tempfile.py unit tests.
|
||||||
import tempfile
|
import tempfile
|
||||||
import errno
|
import errno
|
||||||
|
import io
|
||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
import sys
|
import sys
|
||||||
|
@ -198,7 +199,44 @@ class TestCandidateTempdirList(BaseTestCase):
|
||||||
# paths in this list.
|
# 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):
|
class TestGetCandidateNames(BaseTestCase):
|
||||||
|
|
|
@ -1163,6 +1163,7 @@ Andrew Svetlov
|
||||||
Paul Swartz
|
Paul Swartz
|
||||||
Thenault Sylvain
|
Thenault Sylvain
|
||||||
Péter Szabó
|
Péter Szabó
|
||||||
|
Amir Szekely
|
||||||
Arfrever Frehtes Taifersar Arahesis
|
Arfrever Frehtes Taifersar Arahesis
|
||||||
Neil Tallim
|
Neil Tallim
|
||||||
Geoff Talvola
|
Geoff Talvola
|
||||||
|
|
|
@ -175,6 +175,9 @@ Core and Builtins
|
||||||
Library
|
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
|
- Issue #16564: Fixed regression relative to Python2 in the operation of
|
||||||
email.encoders.encode_7or8bit when used with binary data.
|
email.encoders.encode_7or8bit when used with binary data.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue