On BSD systems a test may leave behind files or directories with flags
such as UF_IMMUTABLE or UF_NOUNLINK set, which prevent the directory from
being modified or removed. Clear the flags before removing, so cleaning
up a temporary directory does not fail.
(cherry picked from commit
1f649fecb645d70b9c48268839e4177d8fe4e1d1)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
def _rmtree_inner(path):
from test.support import _force_run
+ # Clear file flags (e.g. UF_IMMUTABLE, UF_NOUNLINK on BSD).
+ if hasattr(os, 'chflags'):
+ try:
+ os.chflags(path, 0)
+ except OSError:
+ pass
for name in _force_run(path, os.listdir, path):
fullname = os.path.join(path, name)
try:
mode = os.lstat(fullname).st_mode
except OSError:
mode = 0
+ if hasattr(os, 'lchflags'):
+ try:
+ os.lchflags(fullname, 0)
+ except OSError:
+ pass
if stat.S_ISDIR(mode):
_rmtree_inner(fullname)
_force_run(path, os.rmdir, fullname)