@@ -22,6 +22,7 @@ import (
2222 "code.gitea.io/gitea/models/perm"
2323 "code.gitea.io/gitea/modules/git"
2424 "code.gitea.io/gitea/modules/json"
25+ "code.gitea.io/gitea/modules/lfstransfer"
2526 "code.gitea.io/gitea/modules/log"
2627 "code.gitea.io/gitea/modules/pprof"
2728 "code.gitea.io/gitea/modules/private"
@@ -40,6 +41,7 @@ const (
4041 verbUploadArchive = "git-upload-archive"
4142 verbReceivePack = "git-receive-pack"
4243 verbLfsAuthenticate = "git-lfs-authenticate"
44+ verbLfsTransfer = "git-lfs-transfer"
4345)
4446
4547// CmdServ represents the available serv sub-command.
8385 verbUploadArchive : true ,
8486 verbReceivePack : true ,
8587 verbLfsAuthenticate : true ,
88+ verbLfsTransfer : true ,
8689 }
8790 allowedCommandsLfs = map [string ]bool {
8891 verbLfsAuthenticate : true ,
92+ verbLfsTransfer : true ,
8993 }
9094 alphaDashDotPattern = regexp .MustCompile (`[^\w-\.]` )
9195)
@@ -138,7 +142,7 @@ func getAccessMode(verb string, lfsVerb string) perm.AccessMode {
138142 return perm .AccessModeRead
139143 case verbReceivePack :
140144 return perm .AccessModeWrite
141- case verbLfsAuthenticate :
145+ case verbLfsAuthenticate , verbLfsTransfer :
142146 switch lfsVerb {
143147 case "upload" :
144148 return perm .AccessModeWrite
@@ -297,6 +301,15 @@ func runServ(c *cli.Context) error {
297301 return fail (ctx , extra .UserMsg , "ServCommand failed: %s" , extra .Error )
298302 }
299303
304+ // LFS SSH protocol
305+ if verb == verbLfsTransfer {
306+ token , err := getLFSAuthToken (ctx , lfsVerb , results )
307+ if err != nil {
308+ return err
309+ }
310+ return lfstransfer .Main (ctx , repoPath , lfsVerb , token )
311+ }
312+
300313 // LFS token authentication
301314 if verb == verbLfsAuthenticate {
302315 url := fmt .Sprintf ("%s%s/%s.git/info/lfs" , setting .AppURL , url .PathEscape (results .OwnerName ), url .PathEscape (results .RepoName ))
0 commit comments