Skip to content

Commit f13b62b

Browse files
committed
Implement MemoryFS.removetree without having to recurse through the filesystem
1 parent 235b56a commit f13b62b

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

fs/memoryfs.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,10 @@ def remove_entry(self, name):
274274
# type: (Text) -> None
275275
del self._dir[name]
276276

277+
def clear(self):
278+
# type: () -> None
279+
self._dir.clear()
280+
277281
def __contains__(self, name):
278282
# type: (object) -> bool
279283
return name in self._dir
@@ -499,12 +503,29 @@ def remove(self, path):
499503

500504
def removedir(self, path):
501505
# type: (Text) -> None
506+
# make sure the directory is empty
507+
if not self.isempty(path):
508+
return DirectoryNotEmpty(path)
509+
# make sure we are not removing root
502510
_path = self.validatepath(path)
503-
504511
if _path == "/":
505512
raise errors.RemoveRootError()
513+
# we can now delegate to removetree since we confirmed that
514+
# * path exists (isempty)
515+
# * path is a folder (isempty)
516+
# * path is not root
517+
self.removetree(_path)
518+
519+
def removetree(self, path):
520+
# type: (Text) -> None
521+
_path = self.validatepath(path)
506522

507523
with self._lock:
524+
525+
if _path == "/":
526+
self.root.clear()
527+
return
528+
508529
dir_path, file_name = split(_path)
509530
parent_dir_entry = self._get_dir_entry(dir_path)
510531

@@ -515,9 +536,6 @@ def removedir(self, path):
515536
if not dir_dir_entry.is_dir:
516537
raise errors.DirectoryExpected(path)
517538

518-
if len(dir_dir_entry):
519-
raise errors.DirectoryNotEmpty(path)
520-
521539
parent_dir_entry.remove_entry(file_name)
522540

523541
def setinfo(self, path, info):

0 commit comments

Comments
 (0)