diff options
Diffstat (limited to 'pkg/handler/git')
| -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") | 
