Adding basic support for modifying files
This commit is contained in:
parent
c062312f04
commit
4de3dcc799
4
dir.go
4
dir.go
@ -56,9 +56,7 @@ func (this *versionedDir) version() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
version := this.node.ver.db.lastVersion()
|
version := this.node.ver.db.lastVersion()
|
||||||
rebasedPath := version.rebasePath(this.node.path)
|
if err := os.MkdirAll(version.rebasePath(this.node.path), 0755); err != nil {
|
||||||
|
|
||||||
if err := os.MkdirAll(rebasedPath, 0755); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
48
file.go
48
file.go
@ -27,6 +27,7 @@ import (
|
|||||||
"bazil.org/fuse/fs"
|
"bazil.org/fuse/fs"
|
||||||
"errors"
|
"errors"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -45,11 +46,38 @@ func newVersionedFile(node *versionedNode, parent *versionedDir) *versionedFile
|
|||||||
return &versionedFile{node, allocInode(), parent, nil}
|
return &versionedFile{node, allocInode(), parent, nil}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *versionedFile) version() error {
|
||||||
|
if this.node.versioned {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
version := this.node.ver.db.lastVersion()
|
||||||
|
if _, err := fileCopy(this.node.rebasedPath(), version.rebasePath(this.node.path)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
node, err := newVersionedNode(this.node.path, version, this.node)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
node.versioned = true
|
||||||
|
this.node = node
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (this *versionedFile) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) {
|
func (this *versionedFile) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) {
|
||||||
if this.handle != nil {
|
if this.handle != nil {
|
||||||
return nil, errors.New("attempted to open already opened file")
|
return nil, errors.New("attempted to open already opened file")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !req.Flags.IsReadOnly() {
|
||||||
|
if err := this.version(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
handle, err := os.OpenFile(this.node.rebasedPath(), int(req.Flags), 0644)
|
handle, err := os.OpenFile(this.node.rebasedPath(), int(req.Flags), 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -135,3 +163,23 @@ func (this *versionedFile) Fsync(ctx context.Context, req *fuse.FsyncRequest) er
|
|||||||
|
|
||||||
return this.handle.Sync()
|
return this.handle.Sync()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// file helpers
|
||||||
|
//
|
||||||
|
|
||||||
|
func fileCopy(src, dst string) (int64, error) {
|
||||||
|
srcFile, err := os.Open(src)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
defer srcFile.Close()
|
||||||
|
|
||||||
|
dstFile, err := os.Create(dst)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
defer dstFile.Close()
|
||||||
|
|
||||||
|
return io.Copy(srcFile, dstFile)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user