Skip to content

Commit e0736ac

Browse files
committed
Handle NotADirectoryError in shutil._rmtree_unsafe and pathlib.Path.walk when os.walk raises early
1 parent c8ac2d8 commit e0736ac

2 files changed

Lines changed: 32 additions & 23 deletions

File tree

Lib/pathlib/__init__.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,11 +1086,17 @@ def walk(self, top_down=True, on_error=None, follow_symlinks=False):
10861086
root_dir = str(self)
10871087
if not follow_symlinks:
10881088
follow_symlinks = os._walk_symlinks_as_files
1089-
results = os.walk(root_dir, top_down, on_error, follow_symlinks)
1090-
for path_str, dirnames, filenames in results:
1091-
if root_dir == '.':
1092-
path_str = path_str[2:]
1093-
yield self._from_parsed_string(path_str), dirnames, filenames
1089+
try:
1090+
results = os.walk(root_dir, top_down, on_error, follow_symlinks)
1091+
for path_str, dirnames, filenames in results:
1092+
if root_dir == '.':
1093+
path_str = path_str[2:]
1094+
yield self._from_parsed_string(path_str), dirnames, filenames
1095+
except OSError as err:
1096+
if on_error is not None:
1097+
on_error(err)
1098+
else:
1099+
raise
10941100

10951101
def absolute(self):
10961102
"""Return an absolute version of this path

Lib/shutil.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -685,24 +685,27 @@ def _rmtree_unsafe(path, dir_fd, onexc):
685685
def onerror(err):
686686
if not isinstance(err, FileNotFoundError):
687687
onexc(os.scandir, err.filename, err)
688-
results = os.walk(path, topdown=False, onerror=onerror, followlinks=os._walk_symlinks_as_files)
689-
for dirpath, dirnames, filenames in results:
690-
for name in dirnames:
691-
fullname = os.path.join(dirpath, name)
692-
try:
693-
os.rmdir(fullname)
694-
except FileNotFoundError:
695-
continue
696-
except OSError as err:
697-
onexc(os.rmdir, fullname, err)
698-
for name in filenames:
699-
fullname = os.path.join(dirpath, name)
700-
try:
701-
os.unlink(fullname)
702-
except FileNotFoundError:
703-
continue
704-
except OSError as err:
705-
onexc(os.unlink, fullname, err)
688+
try:
689+
results = os.walk(path, topdown=False, onerror=onerror, followlinks=os._walk_symlinks_as_files)
690+
for dirpath, dirnames, filenames in results:
691+
for name in dirnames:
692+
fullname = os.path.join(dirpath, name)
693+
try:
694+
os.rmdir(fullname)
695+
except FileNotFoundError:
696+
continue
697+
except OSError as err:
698+
onexc(os.rmdir, fullname, err)
699+
for name in filenames:
700+
fullname = os.path.join(dirpath, name)
701+
try:
702+
os.unlink(fullname)
703+
except FileNotFoundError:
704+
continue
705+
except OSError as err:
706+
onexc(os.unlink, fullname, err)
707+
except OSError as err:
708+
onexc(os.walk, path, err)
706709
try:
707710
os.rmdir(path)
708711
except FileNotFoundError:

0 commit comments

Comments
 (0)