cerrado @ 6b96b76d66a929a2b428505809fda23a19005c63

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.
  1diff --git a/pkg/git/git.go b/pkg/git/git.go
  2index 591fafb069b141c9e7089f6b6982349b396feef4..66338a126e7cd4af6e064978bdecbeca66283bfc 100644
  3--- a/pkg/git/git.go
  4+++ b/pkg/git/git.go
  5@@ -255,15 +255,22 @@ 			return err
  6 		}
  7 
  8 		if !info.IsDir() {
  9-			c, err := g.FileContent(name)
 10+			file, err := tree.File(name)
 11+			if err != nil {
 12+				return err
 13+			}
 14+
 15+			reader, err := file.Blob.Reader()
 16 			if err != nil {
 17 				return err
 18 			}
 19 
 20-			_, err = tw.Write([]byte(c))
 21+			_, err = io.Copy(tw, reader)
 22 			if err != nil {
 23+				reader.Close()
 24 				return err
 25 			}
 26+			reader.Close()
 27 		}
 28 	}
 29 
 30diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
 31index aed991747bb2e3d5054d2a0921321de6388f48d9..8bb40025338ef5193305370c0999e805dbf91af9 100644
 32--- a/pkg/handler/git/handler.go
 33+++ b/pkg/handler/git/handler.go
 34@@ -39,7 +39,7 @@ 		GetFileContent(name, ref, path string) (string, error)
 35 		GetAbout(name string) (string, error)
 36 		ListTags(name string) ([]*plumbing.Reference, error)
 37 		ListBranches(name string) ([]*plumbing.Reference, error)
 38-		WriteTarGZip(w io.Writer, name, ref, filename string) error
 39+		WriteTarGZip(w io.Writer, name, ref, prefix string) error
 40 	}
 41 
 42 	configurationRepository interface {
 43@@ -91,30 +91,24 @@
 44 func (g *GitHandler) Archive(w http.ResponseWriter, r *http.Request) error {
 45 	ext.SetGZip(w)
 46 	name := r.PathValue("name")
 47-	refs := r.PathValue("refs")
 48-	ref := strings.TrimSuffix(refs, ".tar.gz")
 49+	file := r.PathValue("file")
 50+	ref := strings.TrimSuffix(file, ".tar.gz")
 51 
 52 	// TODO: remove it once we can support more than gzip
 53-	if !strings.HasSuffix(refs, ".tar.gz") {
 54+	if !strings.HasSuffix(file, ".tar.gz") {
 55 		ext.NotFound(w)
 56 		return nil
 57 	}
 58 
 59-	filenameWithExt := fmt.Sprintf("%s-%s.tar.gz", name, ref)
 60-	ext.SetFileName(w, filenameWithExt)
 61-	filename := fmt.Sprintf("%s-%s", name, ref)
 62-
 63-	// writing to a buffer so we can run all the process before writing error
 64-	var buf bytes.Buffer
 65-	err := g.gitService.WriteTarGZip(&buf, name, ref, filename)
 66-	if err != nil {
 67-		return err
 68-	}
 69+	filename := fmt.Sprintf("%s-%s.tar.gz", name, ref)
 70+	ext.SetFileName(w, filename)
 71 
 72-	// since that has write to w it cannot return a error.
 73-	_, err = io.Copy(w, &buf)
 74+	prefix := fmt.Sprintf("%s-%s", name, ref)
 75+	err := g.gitService.WriteTarGZip(w, name, ref, prefix)
 76 	if err != nil {
 77-		slog.Error("Error copying buffer", "error", err)
 78+		// once we start writing to the body we can't report error anymore
 79+		// so we are only left with printing the error.
 80+		slog.Error("Error generating tar gzip file", "error", err)
 81 	}
 82 
 83 	return nil
 84diff --git a/pkg/handler/router.go b/pkg/handler/router.go
 85index 2293ab662f2e92a23bc3d3c953413ad00489cd58..6ee7ba344943842ee40233b224fda539bcb4392b 100644
 86--- a/pkg/handler/router.go
 87+++ b/pkg/handler/router.go
 88@@ -41,7 +41,7 @@ 	mux.HandleFunc("/{name}/refs/{$}", gitHandler.Refs)
 89 	mux.HandleFunc("/{name}/tree/{ref}/{rest...}", gitHandler.Tree)
 90 	mux.HandleFunc("/{name}/blob/{ref}/{rest...}", gitHandler.Blob)
 91 	mux.HandleFunc("/{name}/log/{ref}/", gitHandler.Log)
 92-	mux.HandleFunc("/{name}/archive/{refs...}", gitHandler.Archive)
 93+	mux.HandleFunc("/{name}/archive/{file}", gitHandler.Archive)
 94 	mux.HandleFunc("/config", configHandler)
 95 	mux.HandleFunc("/about", aboutHandler.About)
 96 	mux.HandleFunc("/", gitHandler.List)
 97diff --git a/pkg/service/git.go b/pkg/service/git.go
 98index cbee90a375721e07a0efea8b2653aa9a711d87ed..654d6ac5152f1fb1f225de87be42047c6fac3c8b 100644
 99--- a/pkg/service/git.go
100+++ b/pkg/service/git.go
101@@ -94,7 +94,7 @@ 	}
102 	return repo.Commits(count)
103 }
104 
105-func (g *GitService) WriteTarGZip(w io.Writer, name, ref string, filename string) error {
106+func (g *GitService) WriteTarGZip(w io.Writer, name, ref string, prefix string) error {
107 	r := g.configRepo.GetByName(name)
108 	if r == nil {
109 		return RepositoryNotFoundErr
110@@ -113,8 +113,12 @@
111 	gw := gzip.NewWriter(w)
112 	defer gw.Close()
113 
114-	return repo.WriteTar(gw, filename)
115+	err = repo.WriteTar(gw, prefix)
116+	if err != nil {
117+		return err
118+	}
119 
120+	return nil
121 }
122 
123 func (g *GitService) GetTree(name, ref, path string) (*object.Tree, error) {