aboutsummaryrefslogtreecommitdiff
path: root/pkg/handler
diff options
context:
space:
mode:
authorGabriel A. Giovanini <mail@gabrielgio.me>2024-06-22 16:30:47 +0200
committerGabriel A. Giovanini <mail@gabrielgio.me>2024-06-22 16:30:47 +0200
commite1664fcbc4685906d3dabc66bf947a17bce7efc0 (patch)
treec9ec73616b841e72397fca975e46f691d031e621 /pkg/handler
parent19839337ce0c74b67c5480b71e98d97a112aa104 (diff)
downloadcerrado-e1664fcbc4685906d3dabc66bf947a17bce7efc0.tar.gz
cerrado-e1664fcbc4685906d3dabc66bf947a17bce7efc0.tar.bz2
cerrado-e1664fcbc4685906d3dabc66bf947a17bce7efc0.zip
feat: Add archive capability
Diffstat (limited to 'pkg/handler')
-rw-r--r--pkg/handler/git/handler.go36
-rw-r--r--pkg/handler/router.go1
2 files changed, 37 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")
diff --git a/pkg/handler/router.go b/pkg/handler/router.go
index c8f8984..2293ab6 100644
--- a/pkg/handler/router.go
+++ b/pkg/handler/router.go
@@ -41,6 +41,7 @@ func MountHandler(
mux.HandleFunc("/{name}/tree/{ref}/{rest...}", gitHandler.Tree)
mux.HandleFunc("/{name}/blob/{ref}/{rest...}", gitHandler.Blob)
mux.HandleFunc("/{name}/log/{ref}/", gitHandler.Log)
+ mux.HandleFunc("/{name}/archive/{refs...}", gitHandler.Archive)
mux.HandleFunc("/config", configHandler)
mux.HandleFunc("/about", aboutHandler.About)
mux.HandleFunc("/", gitHandler.List)