func (me *memNode) Link(name string, existing nodefs.Node, context *fuse.Context) (*nodefs.Inode, fuse.Status) { me.Inode().AddChild(name, existing.Inode()) me.mutex.Lock() defer me.mutex.Unlock() me.touch() return existing.Inode(), fuse.OK }
func (node *inMemNode) Link(name string, existing nodefs.Node, context *fuse.Context) (newNode *nodefs.Inode, code fuse.Status) { if node.Inode().GetChild(name) != nil { return nil, fuse.Status(syscall.EEXIST) } node.Inode().AddChild(name, existing.Inode()) if inMemChild, ok := existing.(*inMemNode); ok { inMemChild.incrementLinks() } return existing.Inode(), fuse.OK }
func (parent *inMemNode) Rename(oldName string, newParent nodefs.Node, newName string, context *fuse.Context) (code fuse.Status) { child := parent.Inode().GetChild(oldName) if child == nil { return fuse.ENOENT } parent.Inode().RmChild(oldName) parent.decrementLinks() newParent.Inode().RmChild(newName) newParent.Inode().AddChild(newName, child) if inMemNewParent, ok := newParent.(*inMemNode); ok { inMemNewParent.incrementLinks() } return fuse.OK }
func (t *treeFS) recurse(tree *git.Tree, n nodefs.Node) error { for i := uint64(0); ; i++ { e := tree.EntryByIndex(i) if e == nil { break } isdir := e.Filemode&syscall.S_IFDIR != 0 var chNode nodefs.Node if isdir { chNode = t.newDirNode(e.Id) } else if e.Filemode&^07777 == syscall.S_IFLNK { l, err := t.newLinkNode(e.Id) if err != nil { return err } chNode = l } else if e.Filemode&^07777 == syscall.S_IFREG { b, err := t.newBlobNode(e.Id, e.Filemode) if err != nil { return err } chNode = b } else { panic(e) } n.Inode().NewChild(e.Name, isdir, chNode) if isdir { tree, err := t.repo.LookupTree(e.Id) if err != nil { return err } if err := t.recurse(tree, chNode); err != nil { return nil } } } return nil }
func (me *memNode) Rename(oldName string, newParent nodefs.Node, newName string, context *fuse.Context) (code fuse.Status) { me.mutex.Lock() defer me.mutex.Unlock() ch := me.Inode().RmChild(oldName) if ch == nil { return fuse.ENOENT } if me.original != "" || me == me.fs.root { me.fs.deleted[fastpath.Join(me.original, oldName)] = true } childNode := ch.Node().(*memNode) if childNode.original != "" || childNode == me.fs.root { childNode.materialize() childNode.markChanged() } newParent.Inode().RmChild(newName) newParent.Inode().AddChild(newName, ch) me.touch() return fuse.OK }