Skip to content
Snippets Groups Projects
Adphi's avatar
Adphi authored
a2712fd1

[WIP] affuse: Afero Fuse

Afero Fuse is a small wrapper around fuse allowing to mount any afero file system.

Example:

package main

import (
	"context"
	"os"
	"os/signal"

	"github.com/sirupsen/logrus"
	"github.com/spf13/afero"

	"gitlab.bertha.cloud/adphi/affuse"
)

func main() {
	logrus.SetLevel(logrus.DebugLevel)
	mountPoint := "./test-mount"
	if err := os.MkdirAll(mountPoint, os.ModePerm); err != nil {
		logrus.Fatal("failed to create mount point")
	}
	defer os.RemoveAll(mountPoint)
	mem := afero.NewMemMapFs()
	fs, err := affuse.New(mem)
	if err != nil {
		logrus.Fatalf("failed to create fs: %v", err)
	}
	if err := mem.Mkdir("first", os.ModePerm); err != nil {
		logrus.Fatal(err)
	}
	f, err := mem.Create("first/test")
	if err != nil {
		logrus.Fatal(err)
	}
	defer f.Close()
	if _, err := f.WriteString("success\n"); err != nil {
		logrus.Errorf("failed to write file content: %v", err)
	}
	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt)

	ctx, cancel := context.WithCancel(context.Background())

	go func() {
		<-c
		cancel()
	}()
	defer fs.Unmount()
	if err := fs.Mount(ctx, mountPoint); err != nil {
		logrus.Error("failed to mount file system")
		return
	}
}

TODOs:

  • Tests
  • Some sort of cache
  • Proper File implementation