From d936c102e4aa5574f05110f420b1d5789563ac91 Mon Sep 17 00:00:00 2001 From: thalassemia Date: Thu, 11 Jan 2024 12:37:01 -0800 Subject: [PATCH 1/3] BUG: Ignore cleanup errors on Windows --- mesonpy/__init__.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mesonpy/__init__.py b/mesonpy/__init__.py index 05016a1c3..111493034 100644 --- a/mesonpy/__init__.py +++ b/mesonpy/__init__.py @@ -940,9 +940,16 @@ def _project(config_settings: Optional[Dict[Any, Any]] = None) -> Iterator[Proje build_dir = settings.get('build-dir') editable_verbose = bool(settings.get('editable-verbose')) + ignore_cleanup_errors = False + # Files failing to delete on Windows is a known issue + # (https://bugs.python.org/issue29982) + if os.name == 'nt': + ignore_cleanup_errors = True with contextlib.ExitStack() as ctx: if build_dir is None: - build_dir = ctx.enter_context(tempfile.TemporaryDirectory(prefix='.mesonpy-', dir=source_dir)) + build_dir = ctx.enter_context(tempfile.TemporaryDirectory( + prefix='.mesonpy-', dir=source_dir, + ignore_cleanup_errors=ignore_cleanup_errors)) yield Project(source_dir, build_dir, meson_args, editable_verbose) From c31155830d3018a0bf35b5cb9b6eeb76fcb74d88 Mon Sep 17 00:00:00 2001 From: thalassemia Date: Thu, 11 Jan 2024 14:30:38 -0800 Subject: [PATCH 2/3] MAINT: `ignore_cleanup_errors` only on Python 3.10+ --- mesonpy/__init__.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mesonpy/__init__.py b/mesonpy/__init__.py index 111493034..ab4718f58 100644 --- a/mesonpy/__init__.py +++ b/mesonpy/__init__.py @@ -940,16 +940,18 @@ def _project(config_settings: Optional[Dict[Any, Any]] = None) -> Iterator[Proje build_dir = settings.get('build-dir') editable_verbose = bool(settings.get('editable-verbose')) - ignore_cleanup_errors = False + temp_dir_kwargs = { + 'prefix': '.mesonpy-', + 'dir': source_dir + } # Files failing to delete on Windows is a known issue - # (https://bugs.python.org/issue29982) - if os.name == 'nt': - ignore_cleanup_errors = True + # (https://bugs.python.org/issue29982). `ignore_cleanup_errors` + # was added to `TemporaryDirectory` in Python 3.10 + if sys.version_info[0] == 3 and sys.version_info[1] >= 10 and os.name == 'nt': + temp_dir_kwargs['ignore_cleanup_errors'] = True with contextlib.ExitStack() as ctx: if build_dir is None: - build_dir = ctx.enter_context(tempfile.TemporaryDirectory( - prefix='.mesonpy-', dir=source_dir, - ignore_cleanup_errors=ignore_cleanup_errors)) + build_dir = ctx.enter_context(tempfile.TemporaryDirectory(**temp_dir_kwargs)) yield Project(source_dir, build_dir, meson_args, editable_verbose) From b46864306b22a23d41407b20257972f3714f2a96 Mon Sep 17 00:00:00 2001 From: thalassemia Date: Fri, 12 Jan 2024 16:48:59 -0800 Subject: [PATCH 3/3] BUG: Targeted handling of Windows cleanup error --- mesonpy/__init__.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/mesonpy/__init__.py b/mesonpy/__init__.py index ab4718f58..698719290 100644 --- a/mesonpy/__init__.py +++ b/mesonpy/__init__.py @@ -940,19 +940,22 @@ def _project(config_settings: Optional[Dict[Any, Any]] = None) -> Iterator[Proje build_dir = settings.get('build-dir') editable_verbose = bool(settings.get('editable-verbose')) - temp_dir_kwargs = { - 'prefix': '.mesonpy-', - 'dir': source_dir - } - # Files failing to delete on Windows is a known issue - # (https://bugs.python.org/issue29982). `ignore_cleanup_errors` - # was added to `TemporaryDirectory` in Python 3.10 - if sys.version_info[0] == 3 and sys.version_info[1] >= 10 and os.name == 'nt': - temp_dir_kwargs['ignore_cleanup_errors'] = True - with contextlib.ExitStack() as ctx: - if build_dir is None: - build_dir = ctx.enter_context(tempfile.TemporaryDirectory(**temp_dir_kwargs)) - yield Project(source_dir, build_dir, meson_args, editable_verbose) + try: + with contextlib.ExitStack() as ctx: + if build_dir is None: + build_dir = ctx.enter_context(tempfile.TemporaryDirectory( + prefix='.mesonpy-', dir=source_dir)) + yield Project(source_dir, build_dir, meson_args, editable_verbose) + except PermissionError as exc: + # Cleanup may fail on Windows due to background processes (gh-559) + str_err = str(exc) + if '[WinError 32]' in str_err: + prefix = f'{style.ERROR}meson-python: warning:{style.RESET} ' + str_err = '\n'.join([str_err, + 'Clean up build directory manually, if desired.']) + _log('\n' + textwrap.indent(str_err, prefix)) + else: + raise RuntimeError from exc def _parse_version_string(string: str) -> Tuple[int, ...]: