summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTEC <git@tecosaur.net>2024-01-09 15:06:14 +0800
committerTEC <git@tecosaur.net>2024-01-09 16:25:44 +0800
commit43ca337be3b0bc08f15368f5a056eb1cf466242e (patch)
treebd3f7e4cc2c6eb8bd08518e99d0e45197c0a2940
parent175c29b6db614b43145f38c0616d165fcfa76876 (diff)
downloadcaddy-fs-git-43ca337be3b0bc08f15368f5a056eb1cf466242e.tar.zst
Take two
-rw-r--r--module.go46
1 files changed, 40 insertions, 6 deletions
diff --git a/module.go b/module.go
index 72a5901..ca933ab 100644
--- a/module.go
+++ b/module.go
@@ -2,6 +2,7 @@ package caddyfsgit
import (
"io/fs"
+ "errors"
"github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
@@ -18,15 +19,16 @@ func init() {
// Interface guards
var (
- _ fs.ReadDirFS = (*FS)(nil)
+ _ fs.FS = (*FS)(nil)
_ caddyfile.Unmarshaler = (*FS)(nil)
)
// FS provides a view into a specific git tree.
type FS struct {
- fs.ReadDirFS `json:"-"`
- repoPath string `json:"path,omitempty"`
+ fs.FS `json:"-"`
+ repoPath string `json:"repository,omitempty"`
revision string `json:"revision,omitempty"`
+ revCommit plumbing.Hash
repo *git.Repository
logger *zap.Logger
}
@@ -40,17 +42,44 @@ func (FS) CaddyModule() caddy.ModuleInfo {
}
func (fs *FS) Provision(ctx caddy.Context) error {
+ fs.logger = ctx.Logger(fs)
+ fs.logger.Info("Parsed repository path", zap.String("repository", fs.repoPath))
+ fs.logger.Info("Parsed revision path", zap.String("revision", fs.repoPath))
+ if fs.repoPath == "" {
+ fs.logger.Error("Repository is unset")
+ return errors.New("repository must be set")
+ }
repo, err := git.PlainOpen(fs.repoPath)
if err != nil {
- fs.logger.Error("failed to open git repository", zap.Error(err))
+ fs.logger.Error("failed to open git repository", zap.Error(err),
+ zap.String("path", fs.repoPath))
return err
}
+ if fs.revision == "" {
+ fs.revision = "HEAD"
+ }
fs.repo = repo
return nil
}
func (fs *FS) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
- // Do I need to do anything?
+ if !d.Next() { // skip block beginning
+ return d.ArgErr()
+ }
+ for nesting := d.Nesting(); d.NextBlock(nesting); {
+ switch d.Val() {
+ case "repository":
+ if !d.Args(&fs.repoPath) {
+ return d.ArgErr()
+ }
+ case "revision":
+ if !d.Args(&fs.revision) {
+ return d.ArgErr()
+ }
+ default:
+ return d.Errf("'%s' not a valid caddy.fs.git option", d.Val())
+ }
+ }
return nil
}
@@ -60,6 +89,9 @@ func (gfs *FS) RepoFS() (fs.FS, error) {
gfs.logger.Error("failed to resolve revision", zap.Error(err))
return nil, err
}
+ if *hash ==gfs.revCommit {
+ return gfs.FS, nil
+ }
commit, err := gfs.repo.CommitObject(*hash)
if err != nil {
gfs.logger.Error("failed to get commit object", zap.Error(err))
@@ -70,7 +102,9 @@ func (gfs *FS) RepoFS() (fs.FS, error) {
gfs.logger.Error("failed to get tree object", zap.Error(err))
return nil, err
}
- return gitrepofs.New(gfs.repo, tree, commit.Author.When), nil
+ gfs.revCommit = *hash
+ gfs.FS = gitrepofs.New(gfs.repo, tree, commit.Author.When)
+ return gfs.FS, nil
}
func (gfs *FS) Open(name string) (fs.File, error) {