Work in progress
This commit is contained in:
parent
df0657f88c
commit
f82f0e612f
133
version.go
133
version.go
@ -23,11 +23,12 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bazil.org/fuse"
|
// "bazil.org/fuse"
|
||||||
"bazil.org/fuse/fs"
|
// "bazil.org/fuse/fs"
|
||||||
|
// "golang.org/x/net/context"
|
||||||
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"golang.org/x/net/context"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -40,11 +41,22 @@ type metadata struct {
|
|||||||
Deleted []string
|
Deleted []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type file struct {
|
||||||
|
info os.FileInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
type directory struct {
|
||||||
|
dirs map[string]directory
|
||||||
|
files map[string]file
|
||||||
|
info os.FileInfo
|
||||||
|
}
|
||||||
|
|
||||||
type version struct {
|
type version struct {
|
||||||
base string
|
base string
|
||||||
parent *version
|
parent *version
|
||||||
timestamp time.Time
|
timestamp time.Time
|
||||||
meta metadata
|
meta metadata
|
||||||
|
root directory
|
||||||
}
|
}
|
||||||
|
|
||||||
func newVersion(base string, parent *version) (*version, error) {
|
func newVersion(base string, parent *version) (*version, error) {
|
||||||
@ -72,41 +84,60 @@ func newVersion(base string, parent *version) (*version, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := ver.scanFs(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return ver, nil
|
return ver, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *version) Attr(a *fuse.Attr) {
|
func (this *version) scanDir(path string) (map[string]os.FileInfo, error) {
|
||||||
// type Attr struct {
|
ownNodes := make(map[string]os.FileInfo)
|
||||||
// Inode uint64 // inode number
|
{
|
||||||
// Size uint64 // size in bytes
|
nodes, err := ioutil.ReadDir(this.rebasePath(path))
|
||||||
// Blocks uint64 // size in blocks
|
if err != nil {
|
||||||
// Atime time.Time // time of last access
|
return nil, err
|
||||||
// Mtime time.Time // time of last modification
|
}
|
||||||
// Ctime time.Time // time of last inode change
|
|
||||||
// Crtime time.Time // time of creation (OS X only)
|
|
||||||
// Mode os.FileMode // file mode
|
|
||||||
// Nlink uint32 // number of links
|
|
||||||
// Uid uint32 // owner uid
|
|
||||||
// Gid uint32 // group gid
|
|
||||||
// Rdev uint32 // device numbers
|
|
||||||
// Flags uint32 // chflags(2) flags (OS X only)
|
|
||||||
a.Inode = 1
|
|
||||||
a.Mode = os.ModeDir | 0755
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *version) Lookup(ctx context.Context, name string) (fs.Node, error) {
|
for _, node := range nodes {
|
||||||
// if name == "hello" {
|
ownNodes[node.Name()] = node
|
||||||
// return File{}, nil
|
}
|
||||||
// }
|
|
||||||
return nil, fuse.ENOENT
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *version) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
|
|
||||||
var dirDirs = []fuse.Dirent{
|
|
||||||
{Inode: 2, Name: "hello", Type: fuse.DT_File},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return dirDirs, nil
|
if this.parent == nil {
|
||||||
|
return ownNodes, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
baseNodes, err := this.parent.scanDir(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for ownName, ownNode := range ownNodes {
|
||||||
|
baseNodes[ownName] = ownNode
|
||||||
|
}
|
||||||
|
|
||||||
|
return baseNodes, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *version) buildDir(path string, dir *directory) error {
|
||||||
|
nodes, err := ioutil.ReadDir(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, node := range nodes {
|
||||||
|
if node.IsDir() {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *version) scanFs() error {
|
||||||
|
return this.buildDir(this.rootPath(), &this.root)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *version) loadMetadata() error {
|
func (this *version) loadMetadata() error {
|
||||||
@ -143,3 +174,41 @@ func (this *version) metadataPath() string {
|
|||||||
func (this *version) rootPath() string {
|
func (this *version) rootPath() string {
|
||||||
return filepath.Join(this.base, "root")
|
return filepath.Join(this.base, "root")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *version) rebasePath(path string) string {
|
||||||
|
return filepath.Join(this.rootPath(), path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// func (this *version) Attr(a *fuse.Attr) {
|
||||||
|
// // type Attr struct {
|
||||||
|
// // Inode uint64 // inode number
|
||||||
|
// // Size uint64 // size in bytes
|
||||||
|
// // Blocks uint64 // size in blocks
|
||||||
|
// // Atime time.Time // time of last access
|
||||||
|
// // Mtime time.Time // time of last modification
|
||||||
|
// // Ctime time.Time // time of last inode change
|
||||||
|
// // Crtime time.Time // time of creation (OS X only)
|
||||||
|
// // Mode os.FileMode // file mode
|
||||||
|
// // Nlink uint32 // number of links
|
||||||
|
// // Uid uint32 // owner uid
|
||||||
|
// // Gid uint32 // group gid
|
||||||
|
// // Rdev uint32 // device numbers
|
||||||
|
// // Flags uint32 // chflags(2) flags (OS X only)
|
||||||
|
// a.Inode = 1
|
||||||
|
// a.Mode = os.ModeDir | 0755
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func (this *version) Lookup(ctx context.Context, name string) (fs.Node, error) {
|
||||||
|
// // if name == "hello" {
|
||||||
|
// // return File{}, nil
|
||||||
|
// // }
|
||||||
|
// return nil, fuse.ENOENT
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func (this *version) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
|
||||||
|
// var dirDirs = []fuse.Dirent{
|
||||||
|
// {Inode: 2, Name: "hello", Type: fuse.DT_File},
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return dirDirs, nil
|
||||||
|
// }
|
||||||
|
Loading…
Reference in New Issue
Block a user