From 303add87147576f059649140bad664d8111172a4 Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Sun, 19 Dec 2021 22:40:52 +0100 Subject: [PATCH] feat: Support relative root directories without `BasePathFs` --- internal/cache/cache.go | 13 +++++++++++++ internal/pathext/path.go | 5 +++++ internal/persisters/metadata.go | 6 ++++-- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 internal/pathext/path.go diff --git a/internal/cache/cache.go b/internal/cache/cache.go index edf962e..e5af60d 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -4,6 +4,7 @@ import ( "os" "time" + "github.com/pojntfx/stfs/internal/pathext" "github.com/pojntfx/stfs/pkg/config" "github.com/spf13/afero" ) @@ -17,14 +18,26 @@ func Cache( ) (afero.Fs, error) { switch cacheType { case CacheTypeMemory: + if pathext.IsRoot(root) { + return afero.NewCacheOnReadFs(base, afero.NewMemMapFs(), ttl), nil + } + return afero.NewCacheOnReadFs(afero.NewBasePathFs(base, root), afero.NewMemMapFs(), ttl), nil case CacheTypeDir: if err := os.MkdirAll(cacheDir, os.ModePerm); err != nil { return nil, err } + if pathext.IsRoot(root) { + return afero.NewCacheOnReadFs(base, afero.NewBasePathFs(afero.NewOsFs(), cacheDir), ttl), nil + } + return afero.NewCacheOnReadFs(afero.NewBasePathFs(base, root), afero.NewBasePathFs(afero.NewOsFs(), cacheDir), ttl), nil case config.NoneKey: + if pathext.IsRoot(root) { + return base, nil + } + return afero.NewBasePathFs(base, root), nil default: return nil, ErrCacheTypeUnsupported diff --git a/internal/pathext/path.go b/internal/pathext/path.go new file mode 100644 index 0000000..3f56744 --- /dev/null +++ b/internal/pathext/path.go @@ -0,0 +1,5 @@ +package pathext + +func IsRoot(path string) bool { + return path == "" || path == "." || path == "/" || path == "./" +} diff --git a/internal/persisters/metadata.go b/internal/persisters/metadata.go index b0e6206..dcd108c 100644 --- a/internal/persisters/metadata.go +++ b/internal/persisters/metadata.go @@ -7,10 +7,12 @@ import ( "context" "database/sql" "fmt" + "path/filepath" "strings" "github.com/pojntfx/stfs/internal/db/sqlite/migrations/metadata" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" + "github.com/pojntfx/stfs/internal/pathext" migrate "github.com/rubenv/sql-migrate" "github.com/volatiletech/sqlboiler/v4/boil" "github.com/volatiletech/sqlboiler/v4/queries" @@ -211,7 +213,7 @@ func (p *MetadataPersister) GetHeaderDirectChildren(ctx context.Context, name st headers := models.HeaderSlice{} // Root node - if name == "" || name == "." || name == "/" || name == "./" { + if pathext.IsRoot(name) { prefix = "" depth := depth{} @@ -402,5 +404,5 @@ func (p *MetadataPersister) PurgeAllHeaders(ctx context.Context) error { } func withRelativeRoot(root string) string { - return "./" + strings.TrimPrefix(root, "/") + return filepath.Clean(strings.TrimPrefix(root, "/")) }