112 lines
2.5 KiB
Go
112 lines
2.5 KiB
Go
package vfs
|
||
|
||
import (
|
||
"context"
|
||
"os"
|
||
"time"
|
||
|
||
"gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/fuse"
|
||
"gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/vfs/cache"
|
||
)
|
||
|
||
type FusePackage struct {
|
||
vfs *Vfs
|
||
bktName string
|
||
pkgName string
|
||
modTime time.Time
|
||
mode os.FileMode
|
||
}
|
||
|
||
func newPackageFromCache(cache cache.CacheEntryInfo, vfs *Vfs) fuse.FsDir {
|
||
pathComps := cache.PathComps
|
||
return &FusePackage{
|
||
vfs: vfs,
|
||
bktName: pathComps[0],
|
||
pkgName: pathComps[1],
|
||
modTime: cache.ModTime,
|
||
mode: cache.Mode,
|
||
}
|
||
}
|
||
|
||
func (r *FusePackage) PathComps() []string {
|
||
return []string{r.bktName, r.pkgName}
|
||
}
|
||
|
||
func (r *FusePackage) Name() string {
|
||
return r.pkgName
|
||
}
|
||
|
||
func (r *FusePackage) Size() int64 {
|
||
return 0
|
||
}
|
||
|
||
func (r *FusePackage) Mode() os.FileMode {
|
||
return os.ModeDir | r.mode
|
||
}
|
||
|
||
func (r *FusePackage) ModTime() time.Time {
|
||
return r.modTime
|
||
}
|
||
|
||
func (r *FusePackage) IsDir() bool {
|
||
return true
|
||
}
|
||
|
||
func (r *FusePackage) SetModTime(time time.Time) error {
|
||
dir := r.loadCacheDir()
|
||
if dir == nil {
|
||
return fuse.ErrNotExists
|
||
}
|
||
|
||
return dir.SetModTime(time)
|
||
}
|
||
|
||
// 如果不存在,应该返回ErrNotExists
|
||
func (r *FusePackage) Child(ctx context.Context, name string) (fuse.FsEntry, error) {
|
||
return child(r.vfs, ctx, r, name)
|
||
}
|
||
|
||
func (r *FusePackage) Children(ctx context.Context) ([]fuse.FsEntry, error) {
|
||
return listChildren(r.vfs, ctx, r)
|
||
}
|
||
|
||
func (r *FusePackage) ReadChildren() (fuse.DirReader, error) {
|
||
ens, err := listChildren(r.vfs, context.Background(), r)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return newFuseDirReader(ens), nil
|
||
}
|
||
|
||
func (r *FusePackage) NewDir(ctx context.Context, name string) (fuse.FsDir, error) {
|
||
return newDir(r.vfs, ctx, name, r)
|
||
}
|
||
|
||
func (r *FusePackage) NewFile(ctx context.Context, name string, flags uint32) (fuse.FileHandle, uint32, error) {
|
||
return newFile(r.vfs, ctx, name, r, flags)
|
||
}
|
||
|
||
func (r *FusePackage) RemoveChild(ctx context.Context, name string) error {
|
||
return removeChild(r.vfs, ctx, name, r)
|
||
}
|
||
|
||
func (r *FusePackage) MoveChild(ctx context.Context, oldName string, newName string, newParent fuse.FsDir) error {
|
||
return moveChild(r.vfs, ctx, oldName, r, newName, newParent.(FuseNode))
|
||
}
|
||
|
||
func (r *FusePackage) loadCacheDir() *cache.CacheDir {
|
||
var createOpt *cache.CreateDirOption
|
||
pkg, err := r.vfs.db.Package().GetByFullName(r.vfs.db.DefCtx(), r.bktName, r.pkgName)
|
||
if err == nil {
|
||
createOpt = &cache.CreateDirOption{
|
||
ModTime: pkg.CreateTime,
|
||
}
|
||
}
|
||
|
||
return r.vfs.cache.LoadDir([]string{r.bktName, r.pkgName}, createOpt)
|
||
}
|
||
|
||
var _ fuse.FsDir = (*FusePackage)(nil)
|
||
var _ FuseNode = (*FusePackage)(nil)
|