aboutsummaryrefslogtreecommitdiff
path: root/pkg/handler/git/handler.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/handler/git/handler.go')
-rw-r--r--pkg/handler/git/handler.go36
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")