diff options
author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-06-22 16:30:47 +0200 |
---|---|---|
committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-06-22 16:30:47 +0200 |
commit | e1664fcbc4685906d3dabc66bf947a17bce7efc0 (patch) | |
tree | c9ec73616b841e72397fca975e46f691d031e621 /pkg/handler/git/handler.go | |
parent | 19839337ce0c74b67c5480b71e98d97a112aa104 (diff) | |
download | cerrado-e1664fcbc4685906d3dabc66bf947a17bce7efc0.tar.gz cerrado-e1664fcbc4685906d3dabc66bf947a17bce7efc0.tar.bz2 cerrado-e1664fcbc4685906d3dabc66bf947a17bce7efc0.zip |
feat: Add archive capability
Diffstat (limited to 'pkg/handler/git/handler.go')
-rw-r--r-- | pkg/handler/git/handler.go | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go index 25505ba..aed9917 100644 --- a/pkg/handler/git/handler.go +++ b/pkg/handler/git/handler.go @@ -2,10 +2,13 @@ package git import ( "bytes" + "fmt" "io" + "log/slog" "net/http" "os" "path/filepath" + "strings" "git.gabrielgio.me/cerrado/pkg/ext" "git.gabrielgio.me/cerrado/pkg/service" @@ -36,6 +39,7 @@ type ( GetAbout(name string) (string, error) ListTags(name string) ([]*plumbing.Reference, error) ListBranches(name string) ([]*plumbing.Reference, error) + WriteTarGZip(w io.Writer, name, ref, filename string) error } configurationRepository interface { @@ -84,6 +88,38 @@ func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) error { return nil } +func (g *GitHandler) Archive(w http.ResponseWriter, r *http.Request) error { + ext.SetGZip(w) + name := r.PathValue("name") + refs := r.PathValue("refs") + ref := strings.TrimSuffix(refs, ".tar.gz") + + // TODO: remove it once we can support more than gzip + if !strings.HasSuffix(refs, ".tar.gz") { + ext.NotFound(w) + return nil + } + + filenameWithExt := fmt.Sprintf("%s-%s.tar.gz", name, ref) + ext.SetFileName(w, filenameWithExt) + filename := fmt.Sprintf("%s-%s", name, ref) + + // writing to a buffer so we can run all the process before writing error + var buf bytes.Buffer + err := g.gitService.WriteTarGZip(&buf, name, ref, filename) + if err != nil { + return err + } + + // since that has write to w it cannot return a error. + _, err = io.Copy(w, &buf) + if err != nil { + slog.Error("Error copying buffer", "error", err) + } + + return nil +} + func (g *GitHandler) Summary(w http.ResponseWriter, r *http.Request) error { ext.SetHTML(w) name := r.PathValue("name") |