From 2a03e96bceadfcc5e18bd61e755980ee72dcdb15 Mon Sep 17 00:00:00 2001 From: zeripath Date: Tue, 12 Feb 2019 15:09:43 +0000 Subject: 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) --- routers/repo/download.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'routers/repo/download.go') 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) + } +} -- cgit v1.2.3