| from __future__ import annotations | |
| import shutil | |
| import sys | |
| from typing import TYPE_CHECKING, Any, Callable | |
| if TYPE_CHECKING: | |
| from _typeshed import ExcInfo, StrOrBytesPath | |
| from typing_extensions import TypeAlias | |
| # Same as shutil._OnExcCallback from typeshed | |
| _OnExcCallback: TypeAlias = Callable[[Callable[..., Any], str, BaseException], object] | |
| def shutil_rmtree( | |
| path: StrOrBytesPath, | |
| ignore_errors: bool = False, | |
| onexc: _OnExcCallback | None = None, | |
| ) -> None: | |
| if sys.version_info >= (3, 12): | |
| return shutil.rmtree(path, ignore_errors, onexc=onexc) | |
| def _handler(fn: Callable[..., Any], path: str, excinfo: ExcInfo) -> None: | |
| if onexc: | |
| onexc(fn, path, excinfo[1]) | |
| return shutil.rmtree(path, ignore_errors, onerror=_handler) | |