diff options
| author | TEC <git@tecosaur.net> | 2024-01-09 14:36:31 +0800 |
|---|---|---|
| committer | TEC <git@tecosaur.net> | 2024-01-09 14:52:38 +0800 |
| commit | 175c29b6db614b43145f38c0616d165fcfa76876 (patch) | |
| tree | c7376ab6330bd69259042f6eadbe1ba7cf6f5937 /module.go | |
| parent | 41e72838399ae8ac99497c51a87765dd0a7697a8 (diff) | |
| download | caddy-fs-git-175c29b6db614b43145f38c0616d165fcfa76876.tar.zst | |
Potentially working initial implementation?
Diffstat (limited to 'module.go')
| -rw-r--r-- | module.go | 56 |
1 files changed, 41 insertions, 15 deletions
@@ -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) +} |
