cerrado @ 72495f4538215051540eb05c14db0ed16142e06e

ref: Move binary handling up to the handler

Now it is up to the handler to decide whether it wants to render a file
or not, git only returns the content.
  1diff --git a/pkg/git/git.go b/pkg/git/git.go
  2index 66338a126e7cd4af6e064978bdecbeca66283bfc..6b58d35cd3208ba2d12937ad1b31baca0c8ad78b 100644
  3--- a/pkg/git/git.go
  4+++ b/pkg/git/git.go
  5@@ -2,6 +2,7 @@ package git
  6 
  7 import (
  8 	"archive/tar"
  9+	"bytes"
 10 	"errors"
 11 	"fmt"
 12 	"io"
 13@@ -197,32 +198,54 @@ 	}
 14 	return nil
 15 }
 16 
 17-func (g *GitRepository) FileContent(path string) (string, error) {
 18+func (g *GitRepository) IsBinary(path string) (bool, error) {
 19+	tree, err := g.Tree("")
 20+	if err != nil {
 21+		return false, err
 22+	}
 23+
 24+	file, err := tree.File(path)
 25+	if err != nil {
 26+		return false, err
 27+	}
 28+
 29+	return file.IsBinary()
 30+}
 31+
 32+func (g *GitRepository) FileContent(path string) ([]byte, error) {
 33+	err := g.validateRef()
 34+	if err != nil {
 35+		return nil, err
 36+	}
 37+
 38 	c, err := g.repository.CommitObject(g.ref)
 39 	if err != nil {
 40-		return "", err
 41+		return nil, err
 42 	}
 43 
 44 	tree, err := c.Tree()
 45 	if err != nil {
 46-		return "", err
 47+		return nil, err
 48 	}
 49 
 50 	file, err := tree.File(path)
 51 	if err != nil {
 52-		return "", err
 53+		return nil, err
 54 	}
 55 
 56-	isbin, err := file.IsBinary()
 57+	r, err := file.Blob.Reader()
 58 	if err != nil {
 59-		return "", err
 60+		return nil, err
 61 	}
 62+	defer r.Close()
 63 
 64-	if !isbin {
 65-		return file.Contents()
 66-	} else {
 67-		return "Binary file", nil
 68+	var buf bytes.Buffer
 69+	_, err = io.Copy(&buf, r)
 70+	if err != nil {
 71+		return nil, err
 72 	}
 73+
 74+	return buf.Bytes(), nil
 75 }
 76 
 77 func (g *GitRepository) WriteTar(w io.Writer, prefix string) error {
 78diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
 79index 8bb40025338ef5193305370c0999e805dbf91af9..4c5d19804b31ba6bd0d1b770fc8c8d93ba70d472 100644
 80--- a/pkg/handler/git/handler.go
 81+++ b/pkg/handler/git/handler.go
 82@@ -35,8 +35,9 @@ 		ListRepositories() ([]*service.Repository, error)
 83 		ListCommits(name string, ref string, count int) ([]*object.Commit, error)
 84 		GetHead(name string) (*plumbing.Reference, error)
 85 		GetTree(name, ref, path string) (*object.Tree, error)
 86-		GetFileContent(name, ref, path string) (string, error)
 87-		GetAbout(name string) (string, error)
 88+		IsBinary(name, ref, path string) (bool, error)
 89+		GetFileContent(name, ref, path string) ([]byte, error)
 90+		GetAbout(name string) ([]byte, error)
 91 		ListTags(name string) ([]*plumbing.Reference, error)
 92 		ListBranches(name string) ([]*plumbing.Reference, error)
 93 		WriteTarGZip(w io.Writer, name, ref, prefix string) error
 94@@ -165,7 +166,7 @@ 	}
 95 
 96 	extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock
 97 	p := parser.NewWithExtensions(extensions)
 98-	doc := p.Parse([]byte(file))
 99+	doc := p.Parse(file)
100 
101 	htmlFlag := markdownhtml.CommonFlags | markdownhtml.HrefTargetBlank
102 	opts := markdownhtml.RendererOptions{Flags: htmlFlag}
103@@ -244,6 +245,25 @@ 	name := r.PathValue("name")
104 	ref := r.PathValue("ref")
105 	rest := r.PathValue("rest")
106 
107+	isBin, err := g.gitService.IsBinary(name, ref, rest)
108+	if err != nil {
109+		return err
110+	}
111+
112+	// if it is binary no need to over all the chroma process
113+	if isBin {
114+		gitList := &templates.GitItemPage{
115+			Name: name,
116+			Ref:  ref,
117+			GitItemBase: &templates.GitItemBlobPage{
118+				File:    rest,
119+				Content: []byte("Binary file"),
120+			},
121+		}
122+		templates.WritePageTemplate(w, gitList)
123+		return nil
124+	}
125+
126 	file, err := g.gitService.GetFileContent(name, ref, rest)
127 	if err != nil {
128 		return err
129@@ -255,7 +275,8 @@ 	style := styles.Get("xcode")
130 	formatter := html.New(
131 		html.WithLineNumbers(true),
132 	)
133-	iterator, err := lexer.Tokenise(nil, file)
134+
135+	iterator, err := lexer.Tokenise(nil, string(file))
136 	if err != nil {
137 		return err
138 	}
139diff --git a/pkg/service/git.go b/pkg/service/git.go
140index 654d6ac5152f1fb1f225de87be42047c6fac3c8b..8e25261c1a9c931c0c953960ad1215855f648274 100644
141--- a/pkg/service/git.go
142+++ b/pkg/service/git.go
143@@ -139,37 +139,55 @@
144 	return repo.Tree(path)
145 }
146 
147-func (g *GitService) GetFileContent(name, ref, path string) (string, error) {
148+func (g *GitService) IsBinary(name, ref, path string) (bool, error) {
149 	r := g.configRepo.GetByName(name)
150 	if r == nil {
151-		return "", RepositoryNotFoundErr
152+		return false, RepositoryNotFoundErr
153 	}
154 
155 	repo, err := git.OpenRepository(r.Path)
156 	if err != nil {
157-		return "", err
158+		return false, err
159 	}
160 	err = repo.SetRef(ref)
161 	if err != nil {
162-		return "", err
163+		return false, err
164+	}
165+
166+	return repo.IsBinary(path)
167+}
168+
169+func (g *GitService) GetFileContent(name, ref, path string) ([]byte, error) {
170+	r := g.configRepo.GetByName(name)
171+	if r == nil {
172+		return nil, RepositoryNotFoundErr
173+	}
174+
175+	repo, err := git.OpenRepository(r.Path)
176+	if err != nil {
177+		return nil, err
178+	}
179+	err = repo.SetRef(ref)
180+	if err != nil {
181+		return nil, err
182 	}
183 
184 	return repo.FileContent(path)
185 }
186 
187-func (g *GitService) GetAbout(name string) (string, error) {
188+func (g *GitService) GetAbout(name string) ([]byte, error) {
189 	r := g.configRepo.GetByName(name)
190 	if r == nil {
191-		return "", RepositoryNotFoundErr
192+		return nil, RepositoryNotFoundErr
193 	}
194 
195 	repo, err := git.OpenRepository(r.Path)
196 	if err != nil {
197-		return "", err
198+		return nil, err
199 	}
200 	err = repo.SetRef("")
201 	if err != nil {
202-		return "", err
203+		return nil, err
204 	}
205 
206 	return repo.FileContent(r.About)