]> granicus.if.org Git - python/commitdiff
Issue #16800: tempfile.gettempdir() no longer left temporary files when
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 12 Feb 2013 22:37:29 +0000 (00:37 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 12 Feb 2013 22:37:29 +0000 (00:37 +0200)
the disk is full.  Original patch by Amir Szekely.

1  2 
Lib/tempfile.py
Lib/test/test_tempfile.py
Misc/ACKS
Misc/NEWS

diff --cc Lib/tempfile.py
index 0cc5c04405a8302c79d6fe4264e9c0e1980d8993,0dbd889609d317b1d6cd8e02bcf2b9f3630f37a4..3c3aec1eed4ff8db0b0afa96e44cf430a79da200
@@@ -172,19 -175,21 +172,22 @@@ def _get_default_tempdir()
              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 (OSError, IOError) as e:
 -                if e.args[0] != _errno.EEXIST:
 -                    break # no point trying more names in this directory
 +            except FileExistsError:
                  pass
 -    raise IOError(_errno.ENOENT,
 -                  "No usable temporary directory found in %s" % dirlist)
 +            except OSError:
 +                break   # no point trying more names in this directory
 +    raise FileNotFoundError(_errno.ENOENT,
 +                            "No usable temporary directory found in %s" %
 +                            dirlist)
  
  _name_sequence = None
  
index b638d873c9f0e925faeb0b13e82520d3b9d12d90,cf8b35ac80e0f2b93dd9b161077a589f61cf1101..2962939ce0939d2e8b9a1682679be04b26052ea4
@@@ -197,11 -211,53 +198,48 @@@ class TestCandidateTempdirList(BaseTest
              # Not practical to try to verify the presence of OS-specific
              # paths in this list.
  
 -test_classes.append(test__candidate_tempdir_list)
  
- # We test _get_default_tempdir by testing gettempdir.
+ # We test _get_default_tempdir some more by testing gettempdir.
 -class TestGetDefaultTempdir(TC):
++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(-1)
++                    raise OSError()
+                 with support.swap_attr(io, "open", raise_OSError):
+                     # test again with failing io.open()
 -                    with self.assertRaises(IOError) as cm:
++                    with self.assertRaises(FileNotFoundError):
+                         tempfile._get_default_tempdir()
 -                    self.assertEqual(cm.exception.args[0], errno.ENOENT)
+                     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(IOError) as cm:
++                    with self.assertRaises(FileNotFoundError):
+                         tempfile._get_default_tempdir()
 -                    self.assertEqual(cm.exception.errno, errno.ENOENT)
+                     self.assertEqual(os.listdir(our_temp_directory), [])
  
 -test_classes.append(TestGetDefaultTempdir)
 -
  
 -class test__get_candidate_names(TC):
 +class TestGetCandidateNames(BaseTestCase):
      """Test the internal function _get_candidate_names."""
  
      def test_retval(self):
diff --cc Misc/ACKS
Simple merge
diff --cc Misc/NEWS
Simple merge