diff options
| author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-06-23 16:32:41 +0200 | 
|---|---|---|
| committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-06-23 16:32:41 +0200 | 
| commit | 6b96b76d66a929a2b428505809fda23a19005c63 (patch) | |
| tree | ef653cddb1c45ff23581cd562a5990626d4129af /pkg | |
| parent | e1664fcbc4685906d3dabc66bf947a17bce7efc0 (diff) | |
| download | cerrado-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.
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/git/git.go | 11 | ||||
| -rw-r--r-- | pkg/handler/git/handler.go | 28 | ||||
| -rw-r--r-- | pkg/handler/router.go | 2 | ||||
| -rw-r--r-- | pkg/service/git.go | 8 | 
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) { | 
