Mkdir(name string, perm os.FileMode) error
Remove(name string) error
+ RemoveAll(name string) error
Rename(oldname, newname string) error
MarshalManifest(prefix string) (string, error)
}
}
func (dn *dirnode) Remove(name string) error {
+ return dn.remove(name, false)
+}
+
+func (dn *dirnode) RemoveAll(name string) error {
+ return dn.remove(name, true)
+}
+
+func (dn *dirnode) remove(name string, recursive bool) error {
dirname, name := path.Split(name)
if name == "" || name == "." || name == ".." {
- return ErrInvalidOperation
+ return ErrInvalidArgument
}
dn, ok := dn.lookupPath(dirname).(*dirnode)
if !ok {
case *dirnode:
node.RLock()
defer node.RUnlock()
- if len(node.inodes) > 0 {
+ if !recursive && len(node.inodes) > 0 {
return ErrDirectoryNotEmpty
}
}
// TODO: check manifest content
}
+func (s *CollectionFSSuite) TestRemove(c *check.C) {
+ fs, err := (&Collection{}).FileSystem(s.client, s.kc)
+ c.Assert(err, check.IsNil)
+ err = fs.Mkdir("dir0", 0755)
+ c.Assert(err, check.IsNil)
+ err = fs.Mkdir("dir1", 0755)
+ c.Assert(err, check.IsNil)
+ err = fs.Mkdir("dir1/dir2", 0755)
+ c.Assert(err, check.IsNil)
+
+ err = fs.Remove("dir0")
+ c.Check(err, check.IsNil)
+ err = fs.Remove("dir0")
+ c.Check(err, check.Equals, os.ErrNotExist)
+
+ err = fs.Remove("dir1/dir2/")
+ c.Check(err, check.Equals, ErrInvalidArgument)
+ err = fs.Remove("dir1/dir2/.")
+ c.Check(err, check.Equals, ErrInvalidArgument)
+ err = fs.Remove("dir1/dir2/..")
+ c.Check(err, check.Equals, ErrInvalidArgument)
+ err = fs.Remove("dir1")
+ c.Check(err, check.Equals, ErrDirectoryNotEmpty)
+ err = fs.Remove("dir1/dir2/../../../dir1")
+ c.Check(err, check.Equals, ErrDirectoryNotEmpty)
+ err = fs.RemoveAll("dir1")
+ c.Check(err, check.IsNil)
+ err = fs.RemoveAll("dir1")
+ c.Check(err, check.Equals, os.ErrNotExist)
+}
+
func (s *CollectionFSSuite) TestRename(c *check.C) {
fs, err := (&Collection{}).FileSystem(s.client, s.kc)
c.Assert(err, check.IsNil)
}
func (fs *webdavFS) RemoveAll(ctx context.Context, name string) error {
- return errReadOnly
+ return fs.collfs.RemoveAll(name)
}
func (fs *webdavFS) Rename(ctx context.Context, oldName, newName string) error {
if fs.update == nil {
return errReadOnly
}
- return fs.Rename(oldName, newName)
+ return fs.collfs.Rename(oldName, newName)
}
func (fs *webdavFS) Stat(ctx context.Context, name string) (os.FileInfo, error) {