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)