diff options
author | zeripath <art27@cantab.net> | 2019-02-12 15:09:43 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-12 15:09:43 +0000 |
commit | 2a03e96bceadfcc5e18bd61e755980ee72dcdb15 (patch) | |
tree | 2ecc1848c76fe458f10dffe568a8bb0cdc0f32ee /routers/repo/download.go | |
parent | 296814e887f9bcf0b1d44552deaf40e89e08ab50 (diff) | |
download | gitea-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.go | 56 |
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) + } +} |