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) {