@@ -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