diff --git a/lib/spack/spack/test/util/file_cache.py b/lib/spack/spack/test/util/file_cache.py index 024ce329b31..1b28cd760d7 100644 --- a/lib/spack/spack/test/util/file_cache.py +++ b/lib/spack/spack/test/util/file_cache.py @@ -32,6 +32,27 @@ def test_write_and_read_cache_file(file_cache): assert text == "foobar\n" +@pytest.mark.skipif(sys.platform == "win32", reason="Locks not supported on Windows") +def test_failed_write_and_read_cache_file(file_cache): + """Test failing to write then attempting to read a cached file.""" + with pytest.raises(RuntimeError, match=r"^foobar$"): + with file_cache.write_transaction("test.yaml") as (old, new): + assert old is None + assert new is not None + raise RuntimeError("foobar") + + # Cache dir should have exactly one (lock) file + assert os.listdir(file_cache.root) == [".test.yaml.lock"] + + # File does not exist + assert not file_cache.init_entry("test.yaml") + + # Attempting to read will cause a FileNotFoundError + with pytest.raises(FileNotFoundError, match=r"test\.yaml"): + with file_cache.read_transaction("test.yaml"): + pass + + def test_write_and_remove_cache_file(file_cache): """Test two write transactions on a cached file. Then try to remove an entry from it. diff --git a/lib/spack/spack/util/file_cache.py b/lib/spack/spack/util/file_cache.py index 759d150045a..dc89afdde73 100644 --- a/lib/spack/spack/util/file_cache.py +++ b/lib/spack/spack/util/file_cache.py @@ -144,8 +144,7 @@ def __exit__(cm, type, value, traceback): cm.tmp_file.close() if value: - # remove tmp on exception & raise it - shutil.rmtree(cm.tmp_filename, True) + os.remove(cm.tmp_filename) else: rename(cm.tmp_filename, cm.orig_filename)