summaryrefslogtreecommitdiffstats
path: root/module.go
diff options
context:
space:
mode:
authorTEC <git@tecosaur.net>2024-01-09 23:58:52 +0800
committerTEC <git@tecosaur.net>2024-01-10 00:16:00 +0800
commitdddf64f130c51c8da7f9967a63a5fc4e84993740 (patch)
treed156cd18a4ad8e0d553db2c69ad1a389e1935cc2 /module.go
parentefff01e0dc5663ef2311aedc2d8bef3bbe47221e (diff)
downloadcaddy-fs-git-dddf64f130c51c8da7f9967a63a5fc4e84993740.tar.zst
Implement seekable file type
Diffstat (limited to 'module.go')
-rw-r--r--module.go47
1 files changed, 45 insertions, 2 deletions
diff --git a/module.go b/module.go
index e83641d..6af3b52 100644
--- a/module.go
+++ b/module.go
@@ -1,8 +1,10 @@
package caddyfsgit
import (
- "io/fs"
+ "bytes"
"errors"
+ "io"
+ "io/fs"
"github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
@@ -115,12 +117,53 @@ func (gfs *FS) RepoFS() (fs.FS, error) {
return gfs.FS, nil
}
+// Since go-git's file objects aren't seekable (and Caddy requires
+// seekable files), we'll just read them entirely into a `bytes.Buffer`
+// and use that as the basis for a new `fs.File` type.
+
+var (
+ _ fs.File = (*File)(nil)
+ _ io.Seeker = (*File)(nil)
+)
+
+type File struct {
+ bytes.Reader
+ fileinfo fs.FileInfo
+}
+
+func (f *File) Stat() (fs.FileInfo, error) {
+ return f.fileinfo, nil
+}
+
+func (f *File) Close() error {
+ return nil
+}
+
+func seekableFile(f fs.File) (fs.File, error) {
+ buf, err := io.ReadAll(f)
+ if err != nil {
+ return nil, err
+ }
+ reader := bytes.NewReader(buf)
+ finfo, _ := f.Stat() // We know this will never error
+ return &File{Reader: *reader, fileinfo: finfo}, nil
+}
+
func (gfs *FS) Open(name string) (fs.File, error) {
repofs, err := gfs.RepoFS()
if err != nil {
return nil, err
}
- return repofs.Open(name)
+ file, err := repofs.Open(name)
+ if err != nil {
+ return nil, err
+ }
+ info, _ := file.Stat()
+ if info.IsDir() {
+ return file, nil
+ } else {
+ return seekableFile(file)
+ }
}
// To implement StatFS