13111: Update parent dir modtime when adding/removing/renaming.
authorTom Clegg <tclegg@veritasgenetics.com>
Thu, 21 Dec 2017 06:23:32 +0000 (01:23 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Wed, 3 Jan 2018 05:24:19 +0000 (00:24 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/fs_base.go
sdk/go/arvados/fs_collection.go
sdk/go/arvados/fs_site.go

index 9978c4302e6ac5d61267a217df7a948fa1d35a3d..a3df1684cc90a7fd77d32dd3579c81ced7ced3b6 100644 (file)
@@ -232,8 +232,9 @@ func (n *treenode) Child(name string, replace func(inode) inode) (child inode) {
                if newchild == nil {
                        delete(n.inodes, name)
                } else if newchild != child {
-                       n.inodes[name] = newchild
                        newchild.SetParent(n, name)
+                       n.inodes[name] = newchild
+                       n.fileinfo.modTime = time.Now()
                        child = newchild
                }
        }
@@ -458,8 +459,6 @@ func (fs *fileSystem) Rename(oldname, newname string) error {
                        // Leave oldinode in olddir.
                        return oldinode
                }
-               //TODO: olddirf.setModTime(time.Now())
-               //TODO: newdirf.setModTime(time.Now())
                return nil
        })
        return err
index 0121d2dccce31d745f36fbdf5f2bf7bf0b1463de..e7e6f19690e8c93f47837735b9a2d57d44a76afd 100644 (file)
@@ -67,10 +67,23 @@ func (c *Collection) FileSystem(client apiClient, kc keepClient) (CollectionFile
        if err := root.loadManifest(c.ManifestText); err != nil {
                return nil, err
        }
+       backdateTree(root, modTime)
        fs.root = root
        return fs, nil
 }
 
+func backdateTree(n inode, modTime time.Time) {
+       switch n := n.(type) {
+       case *filenode:
+               n.fileinfo.modTime = modTime
+       case *dirnode:
+               n.fileinfo.modTime = modTime
+               for _, n := range n.inodes {
+                       backdateTree(n, modTime)
+               }
+       }
+}
+
 func (fs *collectionFileSystem) newNode(name string, perm os.FileMode, modTime time.Time) (node inode, err error) {
        if name == "" || name == "." || name == ".." {
                return nil, ErrInvalidArgument
index 8a54b44e7e631928e8d63371669167efdc36e36b..d3ca5102bebee4ee2865b018e0c8d94abfc8add5 100644 (file)
@@ -94,6 +94,7 @@ func (vn *vdirnode) Child(name string, _ func(inode) inode) inode {
                        n := vn.create(vn, name)
                        if n != nil {
                                n.SetParent(vn, name)
+                               vn.inode.(*treenode).fileinfo.modTime = time.Now()
                        }
                        return n
                }