]> source.dussan.org Git - gitea.git/commitdiff
Download lfs in git and web workflow from minio/s3 directly (#16731)
authorAbner <abner199709@gmail.com>
Sat, 21 Aug 2021 18:22:06 +0000 (02:22 +0800)
committerGitHub <noreply@github.com>
Sat, 21 Aug 2021 18:22:06 +0000 (20:22 +0200)
routers/web/repo/download.go
services/lfs/server.go

index 6f43d4b83919837d3caa6427fb858ddccb8703d9..2307f736ad7bb2c9096e5dd1accce742a6a003a9 100644 (file)
@@ -11,6 +11,8 @@ import (
        "code.gitea.io/gitea/modules/httpcache"
        "code.gitea.io/gitea/modules/lfs"
        "code.gitea.io/gitea/modules/log"
+       "code.gitea.io/gitea/modules/setting"
+       "code.gitea.io/gitea/modules/storage"
        "code.gitea.io/gitea/routers/common"
 )
 
@@ -47,6 +49,16 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob) error {
                if httpcache.HandleGenericETagCache(ctx.Req, ctx.Resp, `"`+pointer.Oid+`"`) {
                        return nil
                }
+
+               if setting.LFS.ServeDirect {
+                       //If we have a signed url (S3, object storage), redirect to this directly.
+                       u, err := storage.LFS.URL(pointer.RelativePath(), blob.Name())
+                       if u != nil && err == nil {
+                               ctx.Redirect(u.String())
+                               return nil
+                       }
+               }
+
                lfsDataRc, err := lfs.ReadMetaObject(meta.Pointer)
                if err != nil {
                        return err
index 0d357939d5ecc38333421d2e128c45a1038c1c40..81d535beec4217a665e7f51b4eb5259064dff0ee 100644 (file)
@@ -21,6 +21,7 @@ import (
        lfs_module "code.gitea.io/gitea/modules/lfs"
        "code.gitea.io/gitea/modules/log"
        "code.gitea.io/gitea/modules/setting"
+       "code.gitea.io/gitea/modules/storage"
 
        "github.com/golang-jwt/jwt"
 )
@@ -401,6 +402,13 @@ func buildObjectResponse(rc *requestContext, pointer lfs_module.Pointer, downloa
 
                if download {
                        rep.Actions["download"] = &lfs_module.Link{Href: rc.DownloadLink(pointer), Header: header}
+                       if setting.LFS.ServeDirect {
+                               //If we have a signed url (S3, object storage), redirect to this directly.
+                               u, err := storage.LFS.URL(pointer.RelativePath(), pointer.Oid)
+                               if u != nil && err == nil {
+                                       rep.Actions["download"] = &lfs_module.Link{Href: u.String(), Header: header}
+                               }
+                       }
                }
                if upload {
                        rep.Actions["upload"] = &lfs_module.Link{Href: rc.UploadLink(pointer), Header: header}