95 lines
1.6 KiB
Go
95 lines
1.6 KiB
Go
package fs
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/badjware/gitlabfs/git"
|
|
"github.com/badjware/gitlabfs/gitlab"
|
|
|
|
"github.com/hanwen/go-fuse/v2/fs"
|
|
"github.com/hanwen/go-fuse/v2/fuse"
|
|
)
|
|
|
|
const (
|
|
staticInodeStart = uint64(int(^(uint(0))>>1)) + 1
|
|
)
|
|
|
|
type FSParam struct {
|
|
Git git.GitClonerPuller
|
|
Gitlab gitlab.GitlabFetcher
|
|
|
|
staticInoChan chan uint64
|
|
}
|
|
|
|
type rootNode struct {
|
|
fs.Inode
|
|
param *FSParam
|
|
rootGroupIds []int
|
|
userIds []int
|
|
}
|
|
|
|
var _ = (fs.NodeOnAdder)((*rootNode)(nil))
|
|
|
|
func (n *rootNode) OnAdd(ctx context.Context) {
|
|
projectsInode := n.NewPersistentInode(
|
|
ctx,
|
|
newProjectsNode(
|
|
n.rootGroupIds,
|
|
n.param,
|
|
),
|
|
fs.StableAttr{
|
|
Ino: <-n.param.staticInoChan,
|
|
Mode: fuse.S_IFDIR,
|
|
},
|
|
)
|
|
n.AddChild("projects", projectsInode, false)
|
|
|
|
usersInode := n.NewPersistentInode(
|
|
ctx,
|
|
newUsersNode(
|
|
n.userIds,
|
|
n.param,
|
|
),
|
|
fs.StableAttr{
|
|
Ino: <-n.param.staticInoChan,
|
|
Mode: fuse.S_IFDIR,
|
|
},
|
|
)
|
|
n.AddChild("users", usersInode, false)
|
|
|
|
fmt.Println("Mounted and ready to use")
|
|
}
|
|
|
|
func Start(mountpoint string, rootGroupIds []int, userIds []int, param *FSParam, debug bool) error {
|
|
fmt.Printf("Mounting in %v\n", mountpoint)
|
|
|
|
opts := &fs.Options{}
|
|
opts.Debug = debug
|
|
|
|
param.staticInoChan = make(chan uint64)
|
|
root := &rootNode{
|
|
param: param,
|
|
rootGroupIds: rootGroupIds,
|
|
userIds: userIds,
|
|
}
|
|
|
|
go staticInoGenerator(root.param.staticInoChan)
|
|
|
|
server, err := fs.Mount(mountpoint, root, opts)
|
|
if err != nil {
|
|
return fmt.Errorf("mount failed: %v", err)
|
|
}
|
|
server.Wait()
|
|
|
|
return nil
|
|
}
|
|
|
|
func staticInoGenerator(staticInoChan chan<- uint64) {
|
|
i := staticInodeStart
|
|
for {
|
|
staticInoChan <- i
|
|
i++
|
|
}
|
|
}
|