12483: Add RemoveAll() to CollectionFileSystem.
authorTom Clegg <tclegg@veritasgenetics.com>
Sat, 18 Nov 2017 01:53:38 +0000 (20:53 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Sat, 18 Nov 2017 07:28:40 +0000 (02:28 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/collection_fs.go
sdk/go/arvados/collection_fs_test.go
services/keep-web/webdav.go

index aa549e1159f18ebbd7de4fb3e48c48d7e2eb3525..367f6d003c3c15db529fa9328caf1f154a369ad3 100644 (file)
@@ -116,6 +116,7 @@ type CollectionFileSystem interface {
 
        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)
 }
@@ -926,9 +927,17 @@ func (dn *dirnode) Mkdir(name string, perm os.FileMode) 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 {
@@ -942,7 +951,7 @@ func (dn *dirnode) Remove(name string) error {
        case *dirnode:
                node.RLock()
                defer node.RUnlock()
-               if len(node.inodes) > 0 {
+               if !recursive && len(node.inodes) > 0 {
                        return ErrDirectoryNotEmpty
                }
        }
index 28f5a3499c4a544c6f6b7f8083cca1277f8d3920..5ef357fc1d38af078a61c7040fd4112bc4230e70 100644 (file)
@@ -507,6 +507,37 @@ func (s *CollectionFSSuite) TestRandomWrites(c *check.C) {
        // 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)
index 4a9476dc990bf5ff50519a61e00872c2e62a5b66..7798a69e3cb3ee441436d3940fa1d6e7b892340a 100644 (file)
@@ -49,14 +49,14 @@ func (fs *webdavFS) OpenFile(ctx context.Context, name string, flag int, perm os
 }
 
 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) {