summaryrefslogtreecommitdiffstats
path: root/routers/repo/view.go
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2019-02-21 20:57:16 +0000
committertechknowlogick <matti@mdranta.net>2019-02-21 15:57:16 -0500
commit3b61ff1895d07ef66c8d9cb2408cba1c2490996a (patch)
tree31449429171321ffbdfe8a5161c5700c2866aac5 /routers/repo/view.go
parent994b1be9d12cb5c100ab15091bf5e5856aa38ad3 (diff)
downloadgitea-3b61ff1895d07ef66c8d9cb2408cba1c2490996a.tar.gz
gitea-3b61ff1895d07ef66c8d9cb2408cba1c2490996a.zip
Allow display of LFS stored Readme.md on directory page (#6073) (#6099)
* Fix display of >1Kb LFS text files * Make LFS stored Readme files viewable Signed-off-by: Andrew Thornton <art27@cantab.net> * Slight restructure Signed-off-by: Andrew Thornton <art27@cantab.net> * Slight restructure Signed-off-by: Andrew Thornton <art27@cantab.net> * catch errors and restructure LFS sections
Diffstat (limited to 'routers/repo/view.go')
-rw-r--r--routers/repo/view.go114
1 files changed, 88 insertions, 26 deletions
diff --git a/routers/repo/view.go b/routers/repo/view.go
index da6c527242..c14537bf97 100644
--- a/routers/repo/view.go
+++ b/routers/repo/view.go
@@ -103,13 +103,62 @@ func renderDirectory(ctx *context.Context, treeLink string) {
isTextFile := base.IsTextFile(buf)
ctx.Data["FileIsText"] = isTextFile
ctx.Data["FileName"] = readmeFile.Name()
+ fileSize := int64(0)
+ isLFSFile := false
+ ctx.Data["IsLFSFile"] = false
+
// FIXME: what happens when README file is an image?
+ if isTextFile && setting.LFS.StartServer {
+ meta := lfs.IsPointerFile(&buf)
+ if meta != nil {
+ meta, err = ctx.Repo.Repository.GetLFSMetaObjectByOid(meta.Oid)
+ if err != nil && err != models.ErrLFSObjectNotExist {
+ ctx.ServerError("GetLFSMetaObject", err)
+ return
+ }
+ }
+
+ if meta != nil {
+ ctx.Data["IsLFSFile"] = true
+ isLFSFile = true
+
+ // OK read the lfs object
+ var err error
+ dataRc, err = lfs.ReadMetaObject(meta)
+ if err != nil {
+ ctx.ServerError("ReadMetaObject", err)
+ return
+ }
+ defer dataRc.Close()
+
+ buf = make([]byte, 1024)
+ n, err = dataRc.Read(buf)
+ if err != nil {
+ ctx.ServerError("Data", err)
+ return
+ }
+ buf = buf[:n]
+
+ isTextFile = base.IsTextFile(buf)
+ ctx.Data["IsTextFile"] = isTextFile
+
+ fileSize = meta.Size
+ ctx.Data["FileSize"] = meta.Size
+ filenameBase64 := base64.RawURLEncoding.EncodeToString([]byte(readmeFile.Name()))
+ ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), meta.Oid, filenameBase64)
+ }
+ }
+
+ if !isLFSFile {
+ fileSize = readmeFile.Size()
+ }
+
if isTextFile {
- if readmeFile.Size() >= setting.UI.MaxDisplayFileSize {
+ if fileSize >= setting.UI.MaxDisplayFileSize {
// Pretend that this is a normal text file to display 'This file is too large to be shown'
ctx.Data["IsFileTooLarge"] = true
ctx.Data["IsTextFile"] = true
- ctx.Data["FileSize"] = readmeFile.Size()
+ ctx.Data["FileSize"] = fileSize
} else {
d, _ := ioutil.ReadAll(dataRc)
buf = templates.ToUTF8WithFallback(append(buf, d...))
@@ -168,7 +217,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
ctx.Data["Title"] = ctx.Data["Title"].(string) + " - " + ctx.Repo.TreePath + " at " + ctx.Repo.BranchName
- ctx.Data["FileSize"] = blob.Size()
+ fileSize := blob.Size()
+ ctx.Data["FileSize"] = fileSize
ctx.Data["FileName"] = blob.Name()
ctx.Data["HighlightClass"] = highlight.FileNameToHighlightClass(blob.Name())
ctx.Data["RawFileLink"] = rawLink + "/" + ctx.Repo.TreePath
@@ -182,31 +232,43 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
ctx.Data["IsTextFile"] = isTextFile
//Check for LFS meta file
- if isTextFile {
- if meta := lfs.IsPointerFile(&buf); meta != nil {
- if meta, _ = ctx.Repo.Repository.GetLFSMetaObjectByOid(meta.Oid); meta != nil {
- ctx.Data["IsLFSFile"] = true
- isLFSFile = true
-
- // OK read the lfs object
- dataRc, err := lfs.ReadMetaObject(meta)
- if err != nil {
- ctx.ServerError("ReadMetaObject", err)
- return
- }
- defer dataRc.Close()
+ if isTextFile && setting.LFS.StartServer {
+ meta := lfs.IsPointerFile(&buf)
+ if meta != nil {
+ meta, err = ctx.Repo.Repository.GetLFSMetaObjectByOid(meta.Oid)
+ if err != nil && err != models.ErrLFSObjectNotExist {
+ ctx.ServerError("GetLFSMetaObject", err)
+ return
+ }
+ }
+ if meta != nil {
+ ctx.Data["IsLFSFile"] = true
+ isLFSFile = true
+
+ // OK read the lfs object
+ var err error
+ dataRc, err = lfs.ReadMetaObject(meta)
+ if err != nil {
+ ctx.ServerError("ReadMetaObject", err)
+ return
+ }
+ defer dataRc.Close()
- buf = make([]byte, 1024)
- n, _ = dataRc.Read(buf)
- buf = buf[:n]
+ buf = make([]byte, 1024)
+ n, err = dataRc.Read(buf)
+ if err != nil {
+ ctx.ServerError("Data", err)
+ return
+ }
+ buf = buf[:n]
- isTextFile = base.IsTextFile(buf)
- ctx.Data["IsTextFile"] = isTextFile
+ isTextFile = base.IsTextFile(buf)
+ ctx.Data["IsTextFile"] = isTextFile
- ctx.Data["FileSize"] = meta.Size
- filenameBase64 := base64.RawURLEncoding.EncodeToString([]byte(blob.Name()))
- ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), meta.Oid, filenameBase64)
- }
+ fileSize = meta.Size
+ ctx.Data["FileSize"] = meta.Size
+ filenameBase64 := base64.RawURLEncoding.EncodeToString([]byte(blob.Name()))
+ ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), meta.Oid, filenameBase64)
}
}
@@ -219,7 +281,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
switch {
case isTextFile:
- if blob.Size() >= setting.UI.MaxDisplayFileSize {
+ if fileSize >= setting.UI.MaxDisplayFileSize {
ctx.Data["IsFileTooLarge"] = true
break
}