aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel A. Giovanini <mail@gabrielgio.me>2024-06-23 16:32:41 +0200
committerGabriel A. Giovanini <mail@gabrielgio.me>2024-06-23 16:32:41 +0200
commit6b96b76d66a929a2b428505809fda23a19005c63 (patch)
treeef653cddb1c45ff23581cd562a5990626d4129af
parente1664fcbc4685906d3dabc66bf947a17bce7efc0 (diff)
downloadcerrado-6b96b76d66a929a2b428505809fda23a19005c63.tar.gz
cerrado-6b96b76d66a929a2b428505809fda23a19005c63.tar.bz2
cerrado-6b96b76d66a929a2b428505809fda23a19005c63.zip
fix: Fix bin file not being writen to tar
FileContent was not working for bin file (nor was meant to). Moving to blob reader solves the issue.
-rw-r--r--pkg/git/git.go11
-rw-r--r--pkg/handler/git/handler.go28
-rw-r--r--pkg/handler/router.go2
-rw-r--r--pkg/service/git.go8
4 files changed, 27 insertions, 22 deletions
diff --git a/pkg/git/git.go b/pkg/git/git.go
index 591fafb..66338a1 100644
--- a/pkg/git/git.go
+++ b/pkg/git/git.go
@@ -255,15 +255,22 @@ func (g *GitRepository) WriteTar(w io.Writer, prefix string) error {
}
if !info.IsDir() {
- c, err := g.FileContent(name)
+ file, err := tree.File(name)
if err != nil {
return err
}
- _, err = tw.Write([]byte(c))
+ reader, err := file.Blob.Reader()
if err != nil {
return err
}
+
+ _, err = io.Copy(tw, reader)
+ if err != nil {
+ reader.Close()
+ return err
+ }
+ reader.Close()
}
}
diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
index aed9917..8bb4002 100644
--- a/pkg/handler/git/handler.go
+++ b/pkg/handler/git/handler.go
@@ -39,7 +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
+ WriteTarGZip(w io.Writer, name, ref, prefix string) error
}
configurationRepository interface {
@@ -91,30 +91,24 @@ func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) error {
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")
+ file := r.PathValue("file")
+ ref := strings.TrimSuffix(file, ".tar.gz")
// TODO: remove it once we can support more than gzip
- if !strings.HasSuffix(refs, ".tar.gz") {
+ if !strings.HasSuffix(file, ".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)
+ filename := fmt.Sprintf("%s-%s.tar.gz", name, ref)
+ ext.SetFileName(w, filename)
- // 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)
+ prefix := fmt.Sprintf("%s-%s", name, ref)
+ err := g.gitService.WriteTarGZip(w, name, ref, prefix)
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)
+ // once we start writing to the body we can't report error anymore
+ // so we are only left with printing the error.
+ slog.Error("Error generating tar gzip file", "error", err)
}
return nil
diff --git a/pkg/handler/router.go b/pkg/handler/router.go
index 2293ab6..6ee7ba3 100644
--- a/pkg/handler/router.go
+++ b/pkg/handler/router.go
@@ -41,7 +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("/{name}/archive/{file}", gitHandler.Archive)
mux.HandleFunc("/config", configHandler)
mux.HandleFunc("/about", aboutHandler.About)
mux.HandleFunc("/", gitHandler.List)
diff --git a/pkg/service/git.go b/pkg/service/git.go
index cbee90a..654d6ac 100644
--- a/pkg/service/git.go
+++ b/pkg/service/git.go
@@ -94,7 +94,7 @@ func (g *GitService) ListCommits(name, ref string, count int) ([]*object.Commit,
return repo.Commits(count)
}
-func (g *GitService) WriteTarGZip(w io.Writer, name, ref string, filename string) error {
+func (g *GitService) WriteTarGZip(w io.Writer, name, ref string, prefix string) error {
r := g.configRepo.GetByName(name)
if r == nil {
return RepositoryNotFoundErr
@@ -113,8 +113,12 @@ func (g *GitService) WriteTarGZip(w io.Writer, name, ref string, filename string
gw := gzip.NewWriter(w)
defer gw.Close()
- return repo.WriteTar(gw, filename)
+ err = repo.WriteTar(gw, prefix)
+ if err != nil {
+ return err
+ }
+ return nil
}
func (g *GitService) GetTree(name, ref, path string) (*object.Tree, error) {