summaryrefslogtreecommitdiffstats
path: root/module.go
diff options
context:
space:
mode:
authorTEC <git@tecosaur.net>2024-01-09 14:36:31 +0800
committerTEC <git@tecosaur.net>2024-01-09 14:52:38 +0800
commit175c29b6db614b43145f38c0616d165fcfa76876 (patch)
treec7376ab6330bd69259042f6eadbe1ba7cf6f5937 /module.go
parent41e72838399ae8ac99497c51a87765dd0a7697a8 (diff)
downloadcaddy-fs-git-175c29b6db614b43145f38c0616d165fcfa76876.tar.zst
Potentially working initial implementation?
Diffstat (limited to 'module.go')
-rw-r--r--module.go56
1 files changed, 41 insertions, 15 deletions
diff --git a/module.go b/module.go
index 7b9fc56..72a5901 100644
--- a/module.go
+++ b/module.go
@@ -1,17 +1,15 @@
package caddyfsgit
import (
- "errors"
- "io"
"io/fs"
- "path"
- "strings"
- "time"
+
+ "github.com/caddyserver/caddy/v2"
+ "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
+ "go.uber.org/zap"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
- "github.com/go-git/go-git/v5/plumbing/filemode"
- "github.com/go-git/go-git/v5/plumbing/object"
+ "github.com/thediveo/gitrepofs"
)
func init() {
@@ -27,10 +25,10 @@ var (
// FS provides a view into a specific git tree.
type FS struct {
fs.ReadDirFS `json:"-"`
- repoPath string `json:"path,omitempty"`
- revision string `json:"revision,omitempty"`
- repo *git.Repository
- logger *zap.Logger
+ repoPath string `json:"path,omitempty"`
+ revision string `json:"revision,omitempty"`
+ repo *git.Repository
+ logger *zap.Logger
}
// CaddyModule returns the Caddy module information.
@@ -44,13 +42,41 @@ func (FS) CaddyModule() caddy.ModuleInfo {
func (fs *FS) Provision(ctx caddy.Context) error {
repo, err := git.PlainOpen(fs.repoPath)
if err != nil {
- return fmt.Errorf("failed to open git repository: %w", err)
+ fs.logger.Error("failed to open git repository", zap.Error(err))
+ return err
}
- // TODO
- return nil
+ fs.repo = repo
+ return nil
}
func (fs *FS) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
- // TODO
+ // Do I need to do anything?
return nil
}
+
+func (gfs *FS) RepoFS() (fs.FS, error) {
+ hash, err := gfs.repo.ResolveRevision(plumbing.Revision(gfs.revision))
+ if err != nil {
+ gfs.logger.Error("failed to resolve revision", zap.Error(err))
+ return nil, err
+ }
+ commit, err := gfs.repo.CommitObject(*hash)
+ if err != nil {
+ gfs.logger.Error("failed to get commit object", zap.Error(err))
+ return nil, err
+ }
+ tree, err := commit.Tree()
+ if err != nil {
+ gfs.logger.Error("failed to get tree object", zap.Error(err))
+ return nil, err
+ }
+ return gitrepofs.New(gfs.repo, tree, commit.Author.When), nil
+}
+
+func (gfs *FS) Open(name string) (fs.File, error) {
+ repofs, err := gfs.RepoFS()
+ if err != nil {
+ return nil, err
+ }
+ return repofs.Open(name)
+}