aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mesonlib.py
diff options
context:
space:
mode:
authorChristoph Reiter <reiter.christoph@gmail.com>2020-11-20 15:30:37 +0100
committerDylan Baker <dylan@pnwbakers.com>2020-11-23 09:26:41 -0800
commitabc7e6af01714206100a752898c325282436501f (patch)
treed057fb165f38b1ad71fe483634c11967a6e5b942 /mesonbuild/mesonlib.py
parent1db800bf67fc80abee313381aac0528ee33103c9 (diff)
downloadmeson-abc7e6af01714206100a752898c325282436501f.zip
meson-abc7e6af01714206100a752898c325282436501f.tar.gz
meson-abc7e6af01714206100a752898c325282436501f.tar.bz2
Add a variant of TemporaryDirectory that uses windows_proof_rmtree()
Adds TemporaryDirectoryWinProof which calls windows_proof_rmtree() on error. Use instead of hacky error handling (which might shadow other OSError) in Compiler.compile().
Diffstat (limited to 'mesonbuild/mesonlib.py')
-rw-r--r--mesonbuild/mesonlib.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py
index bb6a748..d46dfca 100644
--- a/mesonbuild/mesonlib.py
+++ b/mesonbuild/mesonlib.py
@@ -22,6 +22,7 @@ import collections
from enum import IntEnum
from functools import lru_cache, wraps
from itertools import tee, filterfalse
+from tempfile import TemporaryDirectory
import typing as T
import uuid
import textwrap
@@ -1452,6 +1453,25 @@ def windows_proof_rm(fpath: str) -> None:
os.unlink(fpath)
+class TemporaryDirectoryWinProof(TemporaryDirectory):
+ """
+ Like TemporaryDirectory, but cleans things up using
+ windows_proof_rmtree()
+ """
+
+ def __exit__(self, exc: T.Any, value: T.Any, tb: T.Any) -> None:
+ try:
+ super().__exit__(exc, value, tb)
+ except OSError:
+ windows_proof_rmtree(self.name)
+
+ def cleanup(self) -> None:
+ try:
+ super().cleanup()
+ except OSError:
+ windows_proof_rmtree(self.name)
+
+
def detect_subprojects(spdir_name: str, current_dir: str = '',
result: T.Optional[T.Dict[str, T.List[str]]] = None) -> T.Optional[T.Dict[str, T.List[str]]]:
if result is None: