Address deprecation warning in shutil.rmtree(onerror=...)

This commit is contained in:
Edgar Ramírez Mondragón 2023-12-01 17:02:12 -06:00 committed by Anthony Sottile
parent 51df34e5fb
commit cffabe54be
2 changed files with 30 additions and 18 deletions

View file

@ -19,5 +19,5 @@ jobs:
main-linux: main-linux:
uses: asottile/workflows/.github/workflows/tox.yml@v1.6.0 uses: asottile/workflows/.github/workflows/tox.yml@v1.6.0
with: with:
env: '["py39", "py310", "py311"]' env: '["py39", "py310", "py311", "py312"]'
os: ubuntu-latest os: ubuntu-latest

View file

@ -202,24 +202,36 @@ else: # pragma: no cover
cmd_output_p = cmd_output_b cmd_output_p = cmd_output_b
def rmtree(path: str) -> None: def _handle_readonly(
"""On windows, rmtree fails for readonly dirs.""" func: Callable[[str], object],
def handle_remove_readonly(
func: Callable[..., Any],
path: str, path: str,
exc: tuple[type[OSError], OSError, TracebackType], exc: OSError,
) -> None: ) -> None:
excvalue = exc[1]
if ( if (
func in (os.rmdir, os.remove, os.unlink) and func in (os.rmdir, os.remove, os.unlink) and
excvalue.errno in {errno.EACCES, errno.EPERM} exc.errno in {errno.EACCES, errno.EPERM}
): ):
for p in (path, os.path.dirname(path)): for p in (path, os.path.dirname(path)):
os.chmod(p, os.stat(p).st_mode | stat.S_IWUSR) os.chmod(p, os.stat(p).st_mode | stat.S_IWUSR)
func(path) func(path)
else: else:
raise raise
shutil.rmtree(path, ignore_errors=False, onerror=handle_remove_readonly)
if sys.version_info < (3, 12): # pragma: <3.12 cover
def _handle_readonly_old(
func: Callable[[str], object],
path: str,
excinfo: tuple[type[OSError], OSError, TracebackType],
) -> None:
return _handle_readonly(func, path, excinfo[1])
def rmtree(path: str) -> None:
shutil.rmtree(path, ignore_errors=False, onerror=_handle_readonly_old)
else: # pragma: >=3.12 cover
def rmtree(path: str) -> None:
"""On windows, rmtree fails for readonly dirs."""
shutil.rmtree(path, ignore_errors=False, onexc=_handle_readonly)
def win_exe(s: str) -> str: def win_exe(s: str) -> str: