mirror of
https://github.com/python/cpython.git
synced 2025-08-29 05:05:03 +00:00
bpo-42782: Fail fast for permission errors in shutil.move() (GH-24001)
* Fail fast in shutil.move() to avoid creating destination directories on failure. Co-authored-by: Zackery Spytz <zspytz@gmail.com>
This commit is contained in:
parent
b36349a647
commit
132131b404
3 changed files with 50 additions and 0 deletions
|
@ -813,6 +813,12 @@ def move(src, dst, copy_function=copy2):
|
|||
if _destinsrc(src, dst):
|
||||
raise Error("Cannot move a directory '%s' into itself"
|
||||
" '%s'." % (src, dst))
|
||||
if (_is_immutable(src)
|
||||
or (not os.access(src, os.W_OK) and os.listdir(src)
|
||||
and sys.platform == 'darwin')):
|
||||
raise PermissionError("Cannot move the non-empty directory "
|
||||
"'%s': Lacking write permission to '%s'."
|
||||
% (src, src))
|
||||
copytree(src, real_dst, copy_function=copy_function,
|
||||
symlinks=True)
|
||||
rmtree(src)
|
||||
|
@ -830,6 +836,11 @@ def _destinsrc(src, dst):
|
|||
dst += os.path.sep
|
||||
return dst.startswith(src)
|
||||
|
||||
def _is_immutable(src):
|
||||
st = _stat(src)
|
||||
immutable_states = [stat.UF_IMMUTABLE, stat.SF_IMMUTABLE]
|
||||
return hasattr(st, 'st_flags') and st.st_flags in immutable_states
|
||||
|
||||
def _get_gid(name):
|
||||
"""Returns a gid, given a group name."""
|
||||
if getgrnam is None or name is None:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue