@@ -59,60 +59,63 @@ const (
5959)
6060
6161type fileInfo struct {
62- isTextFile bool
63- isLFSFile bool
64- fileSize int64
65- lfsMeta * lfs.Pointer
66- st typesniffer.SniffedType
62+ fileSize int64
63+ lfsMeta * lfs.Pointer
64+ st typesniffer.SniffedType
6765}
6866
69- func getFileReader (ctx gocontext.Context , repoID int64 , blob * git.Blob ) ([]byte , io.ReadCloser , * fileInfo , error ) {
70- dataRc , err := blob .DataAsync ()
67+ func (fi * fileInfo ) isLFSFile () bool {
68+ return fi .lfsMeta != nil && fi .lfsMeta .Oid != ""
69+ }
70+
71+ func getFileReader (ctx gocontext.Context , repoID int64 , blob * git.Blob ) (buf []byte , dataRc io.ReadCloser , fi * fileInfo , err error ) {
72+ dataRc , err = blob .DataAsync ()
7173 if err != nil {
7274 return nil , nil , nil , err
7375 }
7476
75- buf := make ([]byte , 1024 )
77+ const prefetchSize = lfs .MetaFileMaxSize
78+
79+ buf = make ([]byte , prefetchSize )
7680 n , _ := util .ReadAtMost (dataRc , buf )
7781 buf = buf [:n ]
7882
79- st := typesniffer .DetectContentType (buf )
80- isTextFile := st .IsText ()
83+ fi = & fileInfo {fileSize : blob .Size (), st : typesniffer .DetectContentType (buf )}
8184
8285 // FIXME: what happens when README file is an image?
83- if ! isTextFile || ! setting .LFS .StartServer {
84- return buf , dataRc , & fileInfo { isTextFile , false , blob . Size (), nil , st } , nil
86+ if ! fi . st . IsText () || ! setting .LFS .StartServer {
87+ return buf , dataRc , fi , nil
8588 }
8689
8790 pointer , _ := lfs .ReadPointerFromBuffer (buf )
88- if ! pointer .IsValid () { // fallback to plain file
89- return buf , dataRc , & fileInfo { isTextFile , false , blob . Size (), nil , st } , nil
91+ if ! pointer .IsValid () { // fallback to a plain file
92+ return buf , dataRc , fi , nil
9093 }
9194
9295 meta , err := git_model .GetLFSMetaObjectByOid (ctx , repoID , pointer .Oid )
93- if err != nil { // fallback to plain file
96+ if err != nil { // fallback to a plain file
9497 log .Warn ("Unable to access LFS pointer %s in repo %d: %v" , pointer .Oid , repoID , err )
95- return buf , dataRc , & fileInfo { isTextFile , false , blob . Size (), nil , st } , nil
98+ return buf , dataRc , fi , nil
9699 }
97100
98- dataRc . Close ()
99-
101+ // close the old dataRc and open the real LFS target
102+ _ = dataRc . Close ()
100103 dataRc , err = lfs .ReadMetaObject (pointer )
101104 if err != nil {
102105 return nil , nil , nil , err
103106 }
104107
105- buf = make ([]byte , 1024 )
108+ buf = make ([]byte , prefetchSize )
106109 n , err = util .ReadAtMost (dataRc , buf )
107110 if err != nil {
108- dataRc .Close ()
109- return nil , nil , nil , err
111+ _ = dataRc .Close ()
112+ return nil , nil , fi , err
110113 }
111114 buf = buf [:n ]
112-
113- st = typesniffer . DetectContentType ( buf )
114-
115- return buf , dataRc , & fileInfo { st . IsText (), true , meta . Size , & meta . Pointer , st } , nil
115+ fi . st = typesniffer . DetectContentType ( buf )
116+ fi . fileSize = blob . Size ( )
117+ fi . lfsMeta = & meta . Pointer
118+ return buf , dataRc , fi , nil
116119}
117120
118121func loadLatestCommitData (ctx * context.Context , latestCommit * git.Commit ) bool {
0 commit comments