summaryrefslogtreecommitdiffstats
path: root/routers/repo/download.go
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2019-02-12 15:09:43 +0000
committerGitHub <noreply@github.com>2019-02-12 15:09:43 +0000
commit2a03e96bceadfcc5e18bd61e755980ee72dcdb15 (patch)
tree2ecc1848c76fe458f10dffe568a8bb0cdc0f32ee /routers/repo/download.go
parent296814e887f9bcf0b1d44552deaf40e89e08ab50 (diff)
downloadgitea-2a03e96bceadfcc5e18bd61e755980ee72dcdb15.tar.gz
gitea-2a03e96bceadfcc5e18bd61e755980ee72dcdb15.zip
Allow markdown files to read from the LFS (#5787)
This PR makes it possible for the markdown renderer to render images and media straight from the LFS. Fix #5746 Signed-off-by: Andrew Thornton [art27@cantab.net](mailto:art27@cantab.net)
Diffstat (limited to 'routers/repo/download.go')
-rw-r--r--routers/repo/download.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/routers/repo/download.go b/routers/repo/download.go
index a863236d6e..57a1e65ac9 100644
--- a/routers/repo/download.go
+++ b/routers/repo/download.go
@@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
+ "code.gitea.io/gitea/modules/lfs"
)
// ServeData download file from io.Reader
@@ -55,6 +56,29 @@ func ServeBlob(ctx *context.Context, blob *git.Blob) error {
return ServeData(ctx, ctx.Repo.TreePath, dataRc)
}
+// ServeBlobOrLFS download a git.Blob redirecting to LFS if necessary
+func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob) error {
+ dataRc, err := blob.DataAsync()
+ if err != nil {
+ return err
+ }
+ defer dataRc.Close()
+
+ if meta, _ := lfs.ReadPointerFile(dataRc); meta != nil {
+ meta, _ = ctx.Repo.Repository.GetLFSMetaObjectByOid(meta.Oid)
+ if meta == nil {
+ return ServeBlob(ctx, blob)
+ }
+ lfsDataRc, err := lfs.ReadMetaObject(meta)
+ if err != nil {
+ return err
+ }
+ return ServeData(ctx, ctx.Repo.TreePath, lfsDataRc)
+ }
+
+ return ServeBlob(ctx, blob)
+}
+
// SingleDownload download a file by repos path
func SingleDownload(ctx *context.Context) {
blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreePath)
@@ -71,6 +95,22 @@ func SingleDownload(ctx *context.Context) {
}
}
+// SingleDownloadOrLFS download a file by repos path redirecting to LFS if necessary
+func SingleDownloadOrLFS(ctx *context.Context) {
+ blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreePath)
+ if err != nil {
+ if git.IsErrNotExist(err) {
+ ctx.NotFound("GetBlobByPath", nil)
+ } else {
+ ctx.ServerError("GetBlobByPath", err)
+ }
+ return
+ }
+ if err = ServeBlobOrLFS(ctx, blob); err != nil {
+ ctx.ServerError("ServeBlobOrLFS", err)
+ }
+}
+
// DownloadByID download a file by sha1 ID
func DownloadByID(ctx *context.Context) {
blob, err := ctx.Repo.GitRepo.GetBlob(ctx.Params("sha"))
@@ -86,3 +126,19 @@ func DownloadByID(ctx *context.Context) {
ctx.ServerError("ServeBlob", err)
}
}
+
+// DownloadByIDOrLFS download a file by sha1 ID taking account of LFS
+func DownloadByIDOrLFS(ctx *context.Context) {
+ blob, err := ctx.Repo.GitRepo.GetBlob(ctx.Params("sha"))
+ if err != nil {
+ if git.IsErrNotExist(err) {
+ ctx.NotFound("GetBlob", nil)
+ } else {
+ ctx.ServerError("GetBlob", err)
+ }
+ return
+ }
+ if err = ServeBlobOrLFS(ctx, blob); err != nil {
+ ctx.ServerError("ServeBlob", err)
+ }
+}